一个命令行 Python 工具 -- Pythonpy
Pythonpy 是一个可以在命令行直接执行简单 Python 表达式的工具。
安装:
pip install pythonpy
使用:
$ py --help
usage: py [-x] [-l] [-c PRE_CMD] [-C POST_CMD] [-V] [-h] [expression]
positional arguments:
expression e.g. py '2 ** 32'
Options:
-x treat each row of stdin as x
-l treat list of stdin as l
-c PRE_CMD run code before expression
-C POST_CMD run code after expression
-V, --version version info
-h, --help show this help message and exit
我的算术能力很差,每次拿到一个文件大小,都是这样来换算单位的:
$ python -c "print 248168/1024.0"
242.3515625
有了 pythonpy 这个工具,就简单得多:
$ py "248168/1024.0"
242.3515625
要查看一个库的版本,以前是这样的:
$ python -c "import pandas; print pandas.__version__"
0.16.2
现在是这样的:
$ py "pandas.__version__"
0.16.2
是不是感觉瞬间少打了好多字。该工具还有一些其他的用法。
自动导入模块
从上边的例子可以看出,Pythonpy 会自动将用到的模块导入:
$ py 'math.exp(1)'
2.71828182846
$ py "random.random() * 10"
9.817973619078444
$ py "datetime.datetime.now()"
2017-03-03 10:15:49.816115
$ py "pandas.DataFrame?"
class DataFrame(pandas.core.generic.NDFrame)
| Two-dimensional size-mutable, potentially heterogeneous tabular data
| structure with labeled axes (rows and columns). Arithmetic operations
| align on both row and column labels. Can be thought of as a dict-like
| container for Series objects. The primary pandas data structure
...
将表达式引用于每行的输入 (py -x)
用 -x
参数,Pythonpy 会将每一行的输入作为变量 x 在表达式中应用。
每一行乘以 3:
$ py "range(3)"
0
1
2
$ py "range(3)" | py -x "int(x) * 3"
0
3
6
抓取一个csv文件的第二列
$ echo $'a1,b1,c1\na2,b2,c2' | py -x 'x.split(",")[1]'
b1
b2
将所有输入行转化为列表 (py -l)
用 -l
参数,相当于 l = list(sys.stdin)
:
$ py "range(3)"
0
1
2
$ py "range(3)" | py -l "type(l)"
<class 'list'>
翻转输入:
$ py 'range(3)' | py -l 'l[::-1]'
2
1
0
求和:
$ py 'range(3)' | py -l 'sum(int(x) for x in l)'
3
统计输入行:
$ py 'range(17)' | py -l 'len(l)'
17
统计某字母开头单词的个数:
$ cat /usr/share/dict/words | py -x 'x[0].lower()' | py -l 'collections.Counter(l).most_common(5)'
('s', 25162)
('p', 24461)
('c', 19901)
('a', 17096)
('u', 16387)
-c 与 -C 区别
这两个参数单独用时,与 python -c
是没有任何区别的。但如果同时用时,则带来了新的特性。-c
表示在表达式之前运行,-C
表示在表达式之后运行。这个描述不太直观,先来看一个应用:
py -c "import pandas as pd; print(pd.__version__)"
0.19.2
也就是我们要对库使用 as
时(毕竟有些库的名字可能太长),Pythonpy 不能直接完成该操作。这是,我们可以用 -c
先执行 import ... as ...
操作,然后再执行一系列后续的操作:
$ py -c "import pandas as pd" -C "print(pd.__version__)"
0.19.2
如果还困惑,这样是不是好些呢:
$ py -C "print(pd.__version__)" -c "import pandas as pd"
0.19.2
所以,-c
指定的表达式会在 -C
指定的表达式之前运行。
总结
如果你习惯使用 Python,或者喜欢用 Python 编写脚本来处理日常工作,那 Pythonpy 是一个不错的选择。至少你不用再打开一个解释器,执行完几条语句后又退出,也不用输入 python -c
。使用 Pythonpy 可以充分发挥你的才华和想象力来高效的完成很多工作,例如作者给出的一些示例:Pythonpy-More-Examples.
本文使用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可,转载请注明出处