重要学习资料
1. 简介
该subprocess模块允许您生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回代码。该模块打算替换几个较旧的模块和功能:
os.system
os.spawn*
2. run方法
调用子流程的推荐方法是将该run() 函数用于它可以处理的所有用例。对于更高级的用例,Popen可以直接使用底层接口。该run()函数是在 Python 3.5 中添加的;
subprocess.run( args , * , stdin=None , input=None , stdout=None , stderr=None , capture_output=False , shell=False , cwd=None , timeout=None , check=False , encoding=None , errors=None , text =None , env=None , Universal_newlines=None , **other_popen_kwargs ) ¶
运行args描述的命令。等待命令完成,然后返回一个CompletedProcess实例。
- demo
>>> subprocess.run(["ls", "-l"]) # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)
>>> subprocess.run("exit 1", shell=True, check=True) # 检查返回值是不是0,不是报错。
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
args
用于启动进程的参数。这可能是一个列表或一个字符串。
returncode
子进程的退出状态。通常,退出状态 0 表示它运行成功。
负值-N表示子进程被信号终止 N(仅限 POSIX)。
stdout
从子进程捕获标准输出。字节序列或字符串(如果 run()使用编码、错误或 text=True 调用)。 None如果标准输出没有被捕获。
如果您使用 运行该进程stderr=subprocess.STDOUT,则 stdout 和 stderr 将在此属性中组合,并且stderr将是 None.
stderr
从子进程捕获 stderr。字节序列或字符串(如果 run()使用编码、错误或 text=True 调用)。 None如果未捕获 stderr。
check_returncode( )
如果returncode不为零,则提高 a CalledProcessError。
3. Popen 构造函数
该模块中的底层进程创建和管理由Popen该类处理。它提供了很大的灵活性,因此开发人员能够处理便利功能未涵盖的不太常见的情况。
subprocess.Popen( args , bufsize=-1 , executable=None , stdin=None , stdout=None , stderr=None , preexec_fn=None , close_fds=True , shell=False , cwd=None , env=None , Universal_newlines=None , startupinfo =None , creationflags=0 , restore_signals=True , start_new_session=False , pass_fds=() , * , group=None , extra_groups=None ,user=None , umask=-1 , encoding=None , errors=None , text=None )
- demo
>>> import shlex, subprocess
>>> command_line = input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print(args)
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # Success!
4. 传统 Shell 调用函数
该模块还提供了 2.xcommands模块中的以下遗留功能 。这些操作隐式调用系统外壳,并且上述关于安全性和异常处理一致性的保证对于这些函数都无效。
-
subprocess.getstatusoutput( cmd )
在 shell中执行cmd 的返回。(exitcode, output)
>>> subprocess.getstatusoutput('ls /bin/ls') (0, '/bin/ls') >>> subprocess.getstatusoutput('cat /bin/junk') (1, 'cat: /bin/junk: No such file or directory') >>> subprocess.getstatusoutput('/bin/junk') (127, 'sh: /bin/junk: not found') >>> subprocess.getstatusoutput('/bin/kill $$') (-15, '')
-
subprocess.getoutput( cmd )
返回在 shell中执行cmd 的输出(stdout 和 stderr)。>>> subprocess.getoutput('ls /bin/ls') '/bin/ls'