Table of Contents generated with DocToc
通过python实现命令行快速打开网页
Oct 18 2015
背景
看了@zoejane同学写的用python打开网页的代码o.py,觉得很棒。
截取里面的一段
if address == 'udemy':
url = 'https://www.udemy.com/automate/learn/'
elif address == 'gb':
url= 'https://zoejane.gitbooks.io/zoe-py-tutorial/content/'
elif address == 'gh':
url ='https://github.com/zoejane'
elif address =='edit':
url ='https://www.gitbook.com/book/zoejane/zoe-py-tutorial/edit'
elif address == 'en':
url ='https://app.yinxiang.com/Home.action'
这一段代码的智慧在于,将网址和简称进行了一个映射,然后想用python打开网页时就不用输入很长的网址,而是输入一个简称就行。
比如,不用输入
python o.py https://zoejane.gitbooks.io/zoe-py-tutorial/content/
而是输入
python o.py gb
之前在看webbrowser库官方文档时,了解到能在命令行中用下面这个命令来打开python官网
python -m webbrowser -t "http://www.python.org"
那么我就在想,能否在zoejane同学代码的基础上进行改进,实现命令行输入python -m o gb
和python -m o gb
能快速打开我的gitbook主页和github主页这样的功能。
寻找python默认模块存储的地址
首先我将shell的工作目录定到o.py的所在目录,命令行运行python -m o gb
,成功打开指定网页。之后再将shell的工作目录定到其他目录,运行命令,出错,出错信息为
/Users/alan/anaconda/bin/python: No module named o
然后我就思考,有没有方法,无论shell的工作目录在哪,我都可以直接使用python -m o
这样的命令。
首先在网上简单搜索了一下,在浏览的过程中想到,python能直接调用webbrowser,那是不是webbrowser.py所在的路径就是python存放默认模块的地址呢?
于是我在Spotlight里搜webbrowser.py,发现路径是
/Users/alan/anaconda/lib/python2.7/webbrowser.py
因为我装了anaconda,所以路径跟Mac下默认的python路径不一样。我在同学的电脑上也搜了下,她因为装了spss23(里面附带安装了python),webbrowser.py所在的路径更奇怪。
Anyway, 找到这个路径之后,我把o.py放到/Users/alan/anaconda/lib/python2.7/
里,也就是webbrowser.py的同级目录里。
之后在shell里运行python -m o gb
,成功打开gitbook网页。换个shell工作目录,同样运行成功。
进行个人定制
接着要做的,就是定制自己的常用网站和缩写。
首先把我常用的网页和缩写写进一个字典结构里
my_link = {}
my_link['gitbook'] = 'https://wp-lai.gitbooks.io/learn-python/content/'
my_link['github'] = 'https://github.com/wp-lai?tab=repositories'
my_link['omooc2py'] = 'https://github.com/OpenMindClub/OMOOC2py/issues'
之后写一个if语句,如果输入信息在缩写列表里,要打开的地址就改为缩写对应的网址,否则打开用户输入的地址。
url = sys.argv[1]
if url in my_link: url = my_link[url]
接着在加一个忽略大小写的功能,让python -m o GitHub
这样的命令也能识别
url = sys.argv[1]
if url.lower() in my_link: url = my_link[url.lower()]
最后将文件名改为openweb.py
,这样就ok了。
最终代码为
import webbrowser,sys
my_link = {}
my_link['gitbook'] = 'https://wp-lai.gitbooks.io/learn-python/content/'
my_link['github'] = 'https://github.com/wp-lai?tab=repositories'
my_link['omooc2py'] = 'https://github.com/OpenMindClub/OMOOC2py/issues'
url = sys.argv[1]
if url.lower() in my_link: url = my_link[url.lower()]
webbrowser.open(url)
然后测试,分别在命令行运行
python -m openweb GItbook
python -m openweb github
python -m openweb OMOOC2py
成功打开我的gitbook主页、github主页、和omooc2py issue页。mission complete。
进一步改进设想
对我来说,做到这一步的功能就能实现我的日常使用了。
如果还要进一步地改进,我觉得可以
- 创建一个excel表格,将网址和缩写填进去
- 在openweb.py里面添加一块代码,读取excel里信息,写进my_link这个字典里
- 或者另写一个脚本,功能是读取excel里信息,写进openweb.py的my_link里
ps:关于python模块的路径其实都存在sys.path这个链表里,所以可以用print sys.path
来显示所有路径,如果想显示得更美观些,可以用
import sys
for i in sys.path:
print i
或者
import sys
print '\n'.join(sys.path)
当python import一个模块时,python会在所有这些路径里寻找。
pps:我在webbrowser.py的源码基础上加了几句语句,写了另一个版本的openweb.py,实现的是同样的功能。代码如下
from webbrowser import *
import sys
my_link = {}
my_link['gitbook'] = 'https://wp-lai.gitbooks.io/learn-python/content/'
my_link['github'] = 'https://github.com/wp-lai?tab=repositories'
my_link['omooc2py'] = 'https://github.com/OpenMindClub/OMOOC2py/issues'
def main():
import getopt
usage = """Usage: %s [-n | -t] url
-n: open new window
-t: open new tab""" % sys.argv[0]
try:
opts, args = getopt.getopt(sys.argv[1:], 'ntd')
except getopt.error, msg:
print >>sys.stderr, msg
print >>sys.stderr, usage
sys.exit(1)
new_win = 0
for o, a in opts:
if o == '-n': new_win = 1
elif o == '-t': new_win = 2
if len(args) != 1:
print >>sys.stderr, usage
sys.exit(1)
if args[0].lower() in my_link:
url = my_link[args[0].lower()]
else:
url = args[0]
open(url, new_win)
print "\a"
if __name__ == "__main__":
main()