• 一个命令行 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
    a2,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.

  • 相关阅读:
    阶段1 语言基础+高级_1-2 -面向对象和封装_2面向对象思想的举例
    阶段1 语言基础+高级_1-2 -面向对象和封装_1面向对象思想的概述
    2-3 【初识组件】顶部 TabBar
    2-2 工程源码文件结构
    Fragment状态保存
    【51单片机】六种亮灯方式
    Hadoop自学笔记(二)HDFS简单介绍
    lvs 负载均衡环境搭建
    [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第十一章 属性
    说说nio----1
  • 原文地址:https://www.cnblogs.com/paisenpython/p/10339462.html
Copyright © 2020-2023  润新知