📅  最后修改于: 2023-12-03 15:38:23.815000             🧑  作者: Mango
在 Python 中,我们可以使用内置的 subprocess 模块来启动子进程。这个模块提供了一种与操作系统的交互方式,允许你执行外部程序并与其进行交互。
要同步执行子进程,可以使用 subprocess.call()
函数。该函数会启动子进程并等待其执行完毕,然后返回子进程的退出代码。以下是示例代码:
import subprocess
# 执行一个命令
subprocess.call(["ls", "-l"])
在上面的代码中,我们使用 subprocess.call()
函数来执行 ls -l
命令。调用该函数会等待命令执行完成,然后返回子进程的退出代码。
如果你需要与子进程进行交互,那么可以使用 subprocess.Popen()
函数来启动子进程。该函数不会等待子进程执行完成,而是立即返回 Popen
对象。以下是示例代码:
import subprocess
# 启动一个子进程
proc = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE)
# 从子进程读取输出
output = proc.stdout.read()
# 等待子进程执行完毕
proc.wait()
# 打印子进程输出
print(output)
在上面的代码中,我们使用 subprocess.Popen()
函数来启动一个子进程,并使用 stdout=subprocess.PIPE
参数将其输出重定向到管道。然后,我们使用 proc.stdout.read()
方法从管道中读取子进程的输出。最后,我们使用 proc.wait()
方法等待子进程执行完毕,并打印子进程的输出。
如果你需要传递命令行参数给子进程,可以将它们作为列表传递给 subprocess.call()
或 subprocess.Popen()
函数。例如:
import subprocess
# 传递命令行参数给子进程
subprocess.call(["echo", "Hello", "World"])
上面的代码会执行 echo Hello World
命令,并将其输出打印到终端。
如果你需要使用 shell 执行命令,可以将 shell=True
参数传递给 subprocess.call()
或 subprocess.Popen()
函数。例如:
import subprocess
# 使用 shell 执行命令
subprocess.call("cat /etc/passwd | grep root", shell=True)
上面的代码会使用 shell 执行 cat /etc/passwd | grep root
命令,并将其输出打印到终端。
当子进程执行出错时,subprocess.call()
函数会抛出 CalledProcessError
异常,而 subprocess.Popen()
函数会返回一个非零的退出代码。你可以在代码中添加异常处理来处理这些情况。例如:
import subprocess
try:
# 执行命令并捕获异常
subprocess.check_call(["ls", "/no/such/directory"])
except subprocess.CalledProcessError as e:
# 处理 CalledProcessError 异常
print("Command failed with return code", e.returncode)
上面的代码会尝试执行 ls /no/such/directory
命令,并捕获 CalledProcessError
异常。如果命令执行失败,就会打印错误消息。