子进程 - 当 shell=False 时出现 FileNotFoundError

问题描述 投票:0回答:2

我正在制作一个可以使用 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

我已经将参数分成了一个序列。

python cmd subprocess
2个回答
4
投票

这是因为

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
中有一个后备可执行文件,因此可以工作。


0
投票

使用

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
)
© www.soinside.com 2019 - 2024. All rights reserved.