阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Python subprocess库六个实例详解

55次阅读
没有评论

共计 2477 个字符,预计需要花费 7 分钟才能阅读完成。

导读 这次来说 Python 的第三方库 subprocess 库,在 python2.4 以上的版本 commands 模块被 subprocess 取代了。一般当我们在用 Python 写运维脚本时,需要履行一些 Linux shell 的命令,Python 中 subprocess 模块就是专门用于调用 Linux shell 命令,并返回状态和结果,可以完美的解决这个问题
subprocess

官方中文文档

介绍参考文档,我的直观感受和实际用法是:subprocess 可以开启一个子进程来运行 cmd 命令。那就意味着可以在一个 py 文件里运行另一个 py 文件

例 1 - 快速使用 subprocess

新建一个目录,目录下有两个文件

|-demo
    |-main.py
    |-hello.py

在 hello.py 中

# hello.py
print('hello world!')

在 main.py 中

import subprocess
subprocess.run(['python', 'hello.py'])

执行 main.py 文件得到如下结果

hello world!
例 2 -subprocess.run() 的返回值

修改代码如下:

# main.py
import subprocess
res = subprocess.run(['python', 'hello.py'])
print("args:", res.args)
print("returncode", res.returncode)

运行后

hello world!
args: ['python', 'hello.py']
returncode: 0

returncode 表示你 run 的这个 py 文件过程是否正确,如果正确,返回 0,否则返回 1

例 3 - 全面的返回值介绍
  • args:被用作启动进程的参数,可能是列表或字符串
  • returncode:子进程的退出状态码
  • stdout:从子进程捕获到的标准输出,但是没设置 subprocess.run() 中的 stdout 参数时,这一项是 None。
  • stderr:捕获到的子进程标准错误,没设置 subprocess.run() 中的 stderr 参数时,这一项是 None。
  • check_returncode():如果 returncode 非零, 抛出 CalledProcessError.
  • 修改 main.py

    # main.py
    import subprocess
    res = subprocess.run(['python', 'hello.py'])
    print("args:", res.args)
    print("returncode", res.returncode)
    print("stdout", res.stdout)
    print("stderr", res.stderr)

    结果:

    hello world!
    args: ['python', 'hello.py']
    returncode 0
    stdout None
    stderr None
    
    Process finished with exit code 0

    可以看到,没有设置 subprocess.run() 中的参数 stdout 和 stderr 时,这两项都是 None

    例 4 - 代码有 bug 的情况

    新建 fail.py,故意制造一个 bug

    # fail.py
    a =

    修改 main.py

    # main.py
    import subprocess
    res = subprocess.run(['python', 'hello.py'])
    res2 = subprocess.run(['python', 'fail.py'])

    再运行 main 函数,得到返回

    hello world!
      File "fail.py", line 2
        a =
          ^
    SyntaxError: invalid syntax

    可以看到,先是正确打印了 hello.py 的内容,然后是 fail.py 的错误信息。

    例 5 - 捕获 stdout 和 stderr

    修改 main.py

    # main.py
    import subprocess
    res = subprocess.run(['python', 'hello.py'], stdout=subprocess.PIPE)
    res2 = subprocess.run(['python', 'fail.py'], stderr=subprocess.PIPE)
    print('hello.py stdout:', res.stdout)
    print('fail.py stderr:', res2.stderr)

    结果

    hello.py stdout: b'hello world!\r\n'
    fail.py stderr: b'File"fail.py", line 2\r\n    a =\r\n      ^\r\nSyntaxError: invalid syntax\r\n'

    可以通过 res.stdout 与 res2.stderr 分别拿到正确 print 的信息和错误信息。

    同时可以发现,子进程 print 和报错内容就不会在父进程打印输出了。

    注意这里的 res.stdout 是一串二进制字符串。如果设置 encoding 参数,拿到的就是字符串。

    res = subprocess.run(['python', 'hello.py'], 
                         stdout=subprocess.PIPE,
                         encoding='utf8')
    例 6 - 与子进程进行通信

    可以通过 subprocess.run() 的 input 参数给子进程发送消息。如果不设置 encoding,就要传入二进制串,比如 b ’hello input’

    # main.py
    import subprocess
    from subprocess import PIPE
    res = subprocess.run(['python', 'hello.py'],
                         input='hello input',
                         encoding='utf8')

    修改 hello.py 接收传进来的字符串。

    # hello.py 
    import sys
    data = sys.stdin.read()
    print(data)

    结果

    hello input
    
    Process finished with exit code 0

    阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

    腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

    代金券:在阿里云专用满减优惠券

    正文完
    星哥说事-微信公众号
    post-qrcode
     0
    星锅
    版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计2477字。
    转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
    【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
    阿里云-最新活动爆款每日限量供应
    评论(没有评论)
    验证码
    【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中