Python 当shell=False时,子进程-FileNotFoundError
我正在制作一个GUI,它可以使用subprocess和tkinter在命令提示符下执行Python 当shell=False时,子进程-FileNotFoundError,python,cmd,subprocess,Python,Cmd,Subprocess,我正在制作一个GUI,它可以使用subprocess和tkinter在命令提示符下执行 def test_subprocess(self): proc = subprocess.Popen(["echo", "Hello"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, shell=False) response = proc.communicate()[0
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上的ex:适用于:
proc = subprocess.Popen(["cmd", "/c", "echo", "Hello"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, shell=False)
但我想这只是一个练习,因为从Popen
运行echo
对于print
:)来说是一种过度的操作
注意:在Linux/UNIX中,它也是内置的,但正如cdarke所说,在某些版本的
/bin
中有一个回退可执行文件,因此可以工作。这是因为echo
是Windows中的内置命令,而不是可执行文件。您必须启用shell=True
才能使其正常工作
(或者根据您的操作系统添加shell前缀,例如bash-c
或cmd/c
)
windows上的ex:适用于:
proc = subprocess.Popen(["cmd", "/c", "echo", "Hello"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, shell=False)
但我想这只是一个练习,因为从Popen
运行echo
对于print
:)来说是一种过度的操作
注意:在Linux/UNIX中,它也是内置的,但正如cdarke所说,在某些版本中,
/bin
中有一个后备可执行文件,因此可以工作。只需补充一点,许多UNIX系统都有/bin/echo
以及shell内置程序,因此您可能只会在Windows上遇到这个问题。@cdarke:很好。用户显然在使用windows,错误消息是有史以来最糟糕的,甚至没有告诉它找不到哪个文件:)当文件名没有报告时,你不讨厌它吗?它很清楚找不到哪个文件,但懒得告诉我们。你甚至不能运行strace
来找出答案。这确实令人沮丧。我使用WindowsError/FileNotFoundError
上的try/catch块来保护Popen
调用,并在捕获异常时打印完整的命令。只需补充一点,许多UNIX系统都有/bin/echo
以及shell内置,因此您可能只会在Windows上遇到这个特定问题。@cdarke:nice。用户显然在使用windows,错误消息是有史以来最糟糕的,甚至没有告诉它找不到哪个文件:)当文件名没有报告时,你不讨厌它吗?它很清楚找不到哪个文件,但懒得告诉我们。你甚至不能运行strace
来找出答案。这确实令人沮丧。我使用WindowsError/FileNotFoundError
上的try/catch块来保护Popen
调用,并在捕获异常时打印完整命令。