# 导入模块 > import subprocess # 执行系统命令 wc-l 'ls','-l']) > cmd = subprocess.run([ # 运行状态,运行成功返回0 > cmd.returncode 0 > import shlex, subprocess 'ls -l' > command_line = > args = shlex.split(command_line) > subprocess.run(args) 'ls -l', shell = True) cmd = subprocess.run( 注意,必须设置shell参数的值为True才可以支持字符串写法,否则程序会认为第一个参数是一个文件路径,找不到该路径,然后报错 'ls -l') cmd = subprocess.run( Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.5/subprocess.py", line 693, in run with Popen(*popenargs, **kwargs) as process: File "/usr/lib/python3.5/subprocess.py", line 947, in __init__ restore_signals, start_new_session) File "/usr/lib/python3.5/subprocess.py", line 1551, in _execute_child raise child_exception_type(errno_num, err_msg) FileNotFoundError: [Errno 2] No such file or directory: 'ls -l' shell参数的真正作用是交给系统的shell脚本来执行命令,比如复杂的linux命令 'cat config.txt | grep "samples" | cut -f1 > a.txt', shell = True) subprocess.run( 除了单纯执行系统命令外,有时我们还希望得到执行后的结果,此时的写法如下 'ls -l', shell = True, capture_output=True) cmd = subprocess.run( 'utf8') cmd.stdout.decode( 设置capture_output参数的值为True, 在返回对象中会包含stdout属性,默认以字节形式返回执行的结果,只需要用decode解码,即可转换为字符串。 另外,还支持限定执行时间,如果超时,则报错,写法如下 'ls -l', shell = True, timeout = 100) cmd = subprocess.run( time参数的单位为秒, 对于联网下载数据等操作,设置超时时间,可以避免因为网络原因引起的阻塞。 以上这些都是基本用法,在subprocess模块中,还提供了Popen方法,提供了更加灵活强大的功能,可以控制系统命令的输入输出,通过管道连接多个命令。控制标准输入的经典使用场景是运行交互式的命令,用法如下 > import subprocess # stdin 控制标准输入流 # stdout 控制标准输出流 "python", stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) > s = subprocess.Popen( # 向标准输入流写入参数 "print('hello')") > s.stdin.write(b 14 > s.stdin.close() # 从标准输出流读出运行结果 "utf8") > out = s.stdout.read().decode( > s.stdout.close() > out 'hello\n' 还有一种用法是捕获程序的标准输出和标准错误流,用法如下 'ls', '-l'], stdout = subprocess.PIPE) > p = subprocess.Popen([ > outs, errors = p.communicate() outs存储的是程序的输出结果,error存储的是程序的报错信息。又时我们希望不显示程序的输出和报错信息,此时可以将标准输出和标准错误流重定向到/dev/null,写法如下 'ls', '-l'], stdout = subprocess.DEVNULL, stderr = subprocess.DEVNULL) > subprocess.Popen([ 更多用法请查看subprocess模块的API文档。 ·end· |
|