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 gbpython -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()

results matching ""

    No results matching ""