【一】介绍与模块导入
- 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'])