如前所述,您可以(并且应该)使用subprocess模块。
默认情况下,shell
参数是False
。这很好,也很安全。此外,您不需要传递完整路径,只需将可执行文件名称和参数作为序列(元组或列表)传递。
import subprocess
# This works fine
p = subprocess.Popen(["echo","2"])
# These will raise OSError exception:
p = subprocess.Popen("echo 2")
p = subprocess.Popen(["echo 2"])
p = subprocess.Popen(["echa", "2"])
您还可以使用已经在子流程模块中定义的这两个便利功能:
# Their arguments are the same as the Popen constructor
retcode = subprocess.call(["echo", "2"])
subprocess.check_call(["echo", "2"])
请记住,您可以重定向stdout
和/或stderr
到PIPE
,因此它不会打印到屏幕上(但输出仍然可供您的 python 程序读取)。默认情况下,stdout
and stderr
are both None
,这意味着没有重定向,这意味着它们将使用与您的 python 程序相同的 stdout/stderr。
此外,您可以使用shell=True
和重定向stdout
. stderr
到 PIPE,因此不会打印任何消息:
# This will work fine, but no output will be printed
p = subprocess.Popen("echo 2", shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# This will NOT raise an exception, and the shell error message is redirected to PIPE
p = subprocess.Popen("echa 2", shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)