我正在制作一个可以使用 subprocess 和 tkinter 在命令提示符下执行的 GUI。
def test_subprocess(self):
proc = subprocess.Popen(["echo", "Hello"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, shell=False)
response = proc.communicate()[0]
self.log.insert("end", response)
如果我设置
shell=False
,我会收到此错误:
FileNotFoundError: [WinError 2] The system cannot find the file specified
我已经将参数分成了一个序列。
这是因为
echo
是 Windows 中的内置命令,而不是可执行文件。您必须启用shell=True
才能使其正常工作。
(或添加 shell 前缀,例如
bash -c
或 cmd /c
,具体取决于您的操作系统)
在 Windows 上为您提供:有效:
proc = subprocess.Popen(["cmd", "/c", "echo", "Hello"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, shell=False)
但我认为这只是一个练习,因为从
echo
运行 Popen
对于 print
来说有点矫枉过正 :)
注意:在 Linux/UNIX 中它也是内置的,但正如 cdarke 所说,在某些版本的
/bin
中有一个后备可执行文件,因此可以工作。
使用
bash -c
或 cmd -c
之外的另一种解决方案:
从 python 3.3 开始你可以调用
shutil.which
更多信息请访问 https://docs.python.org/3/library/shutil.html :
import shutil
proc = subprocess.Popen(
[shutil.which("echo"), "Hello"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
universal_newlines=True,
shell=False
)