模块学习之subprocess模块

【一】介绍与模块导入

  • subprocess模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
  • 简单理解就是:使用我们自己的电脑去链接别人的电脑 (socket模块)
  • 模块导入:
import subprocess

【二】run方法

import subprocess


def runcmd(command):
    ret = subprocess.run(command,  # 子进程要执行的命令
                         shell=True,  # 执行的是shell的命令
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE,
                         encoding="utf-8",
                         timeout=1)

    # returncode属性是run()函数返回结果的状态。
    if ret.returncode == 0:
        print("success:", ret)
    else:
        print("error:", ret)


runcmd(["dir", "/b"])  # 序列参数
# success: CompletedProcess(args=['dir', '/b'], returncode=0, stderr='')
runcmd("exit 1")  # 字符串参数
# error: CompletedProcess(args='exit 1', returncode=1, stdout='', stderr='')

【三】popen方法

  • Popen 是 subprocess的核心,子进程的创建和管理都靠它处理
import subprocess

p = subprocess.Popen('ls -l', shell=True)


# Popen的对象所具有的方法:
#       poll(): 检查进程是否终止,如果终止则返回 returncode,否则返回 None。
#       wait(timeout): 等待子进程终止。
#       communicate(input,timeout): 和子进程交互,发送和读取数据。
#       send_signal(singnal): 发送信号到子进程 。
#       terminate(): 停止子进程,也就是发送SIGTERM信号到子进程。
#       kill(): 杀死子进程。发送 SIGKILL 信号到子进程。

def f(command):
    # 创建一个子进程,并且执行
    res_subprocess = subprocess.Popen(command,
                                      shell=True,
                                      stdout=subprocess.PIPE,
                                      stderr=subprocess.PIPE,
                                      encoding="utf-8")
    # 这里是用wait()方法,等待子进程结束。
    res_subprocess.wait(2)
    if res_subprocess.poll() == 0:
        print(res_subprocess.communicate()[1])
    else:
        print("失败")


f("python --version")
f("exit 1")

【四】call方法

  • 调用subprocess.call()函数执行命令,将需要执行的命令以列表形式传递给该函数
import subprocess

subprocess.call(['python', '--version'])
# Python 3.10.11
  • 需要注意的是,在Linux或macOS系统上,可能需要使用sudo命令来获得管理员权限
import subprocess

subprocess.call(['sudo','python', '--version'])
posted @ 2024-05-09 15:31  Ligo6  阅读(50)  评论(0)    收藏  举报