python shell 命令总结

2020/05/03 技术

python shell 命令总结

1. fileinput 实现管道输入

parse_time.py 实现一个清洗时间的命令:

# !/usr/bin/env python3
import datetime
import fileinput
import sys


def parse_time(date_str):
    _time = datetime.datetime.strptime(date_str.strip(), "%d %b %y")
    return _time.strftime("%Y-%m-%d")


with fileinput.input() as f_input:
    for line in f_input:
        try:
            new_line = parse_time(line)
        except Exception as e:
            sys.exit(1)
        print(new_line)

sys.exit(0)

使用方法:

# 清洗
( echo -e "30 Nov 00\n29 May 20" | python3 parse_time.py ) && echo "success"

输出结果:
2000-11-30
2020-05-29
success

# 解析错误
( echo -e "30 abc 00\n29 May 20" | python3 parse_time.py ) || echo "failed" 

输出结果:
failed

2. python 包命令

本示例演示两种命令行执行 python 包指令的方法. 源码见python_command

2.1 目标

在自建 python 包py_package 中, 提供两种命令执行方式:

一种是

python -m py_package
python -m py_package.a

另一种是

py_pacakge_print 
py_pacakge_print_a

2.2 实现

指令一

对于第一种指令,

命令 python -m py_package 实际上是运行 py_package/__main__.py.

命令 python -m py_package.a 实际上是运行 py_package/a/__main__.py.

所以, 提供相应的__main__.py 即可:

./__main__.py:


from .cmd import cmd_demo

if __name__ == '__main__':
    cmd_demo(name="py_package")

./a/__main__.py:

from ..cmd import cmd_demo

if __name__ == '__main__':
    cmd_demo(name="py_package/a")

指令二

对于第二种指令, 其实是在 setup.py 中的 entry_points 提供命令映射.

本例中, 可以这样设置:

    entry_points={
        'console_scripts': [
            'py_package_print = py_package.info:print_package',
            'py_package_print_a = py_package:print_a'
        ]
    }

2.3 结果

使用 docker-compose 运行实例:

docker-compose up

日志中可看到执行结果:

py-cmd    | exec:       python -m py_package xxxx
py-cmd    | [py_package] read input: /usr/local/lib/python3.7/site-packages/py_package/__main__.py xxxx
py-cmd    | 
py-cmd    | 
py-cmd    | exec:       python -m py_package.a yyyy
py-cmd    | [py_package/a] read input: /usr/local/lib/python3.7/site-packages/py_package/a/__main__.py yyyy
py-cmd    | 
py-cmd    | 
py-cmd    | exec:       py_package_print
py-cmd    | file in py_package/:
py-cmd    |     __main__.py
py-cmd    |     __pycache__
py-cmd    |     __init__.py
py-cmd    |     cmd
py-cmd    |     a
py-cmd    |     info.py
py-cmd    | 
py-cmd    | 
py-cmd    | 
py-cmd    | exec:       py_package_print_a
py-cmd    | file in py_package/a/:
py-cmd    |     __main__.py
py-cmd    |     __pycache__
py-cmd    |     __init__.py
py-cmd    | 

3. shell 执行 python 脚本

3.1 使用 python -c 执行 python 代码

```shell script #!/bin/bash

python -c ‘import os; print(os.environ)’


### 3.2 拷贝 python 源码到 shell 脚本

```shell script
#!/bin/bash

tmp_py="tmp.py"

# 代码行
cat > ${tmp_py} <<EOF
import os
print(os.environ)
EOF

# 执行
python -u ${tmp_py}

# 删除 临时 python 文件
rm ${tmp_py}

3. 使用 subprocess 执行 bash脚本


import os  # noqa
import typing  # noqa
import subprocess


commands = '''
echo "content" > ./1.txt
echo -e "content2\n1\n2\n3\n" >> ./1.txt
cat ./1.txt
rm ./1.txt

'''

result = subprocess.check_output(commands, executable="/bin/bash", shell=True).decode("utf-8")

print(result)

Search

    Table of Contents