python的subprocess— 子流程管理模块学习

重要学习资料

官网教程

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'
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早睡的叶子

你的鼓励就是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值