Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当shell=False时,子进程-FileNotFoundError_Python_Cmd_Subprocess - Fatal编程技术网

Python 当shell=False时,子进程-FileNotFoundError

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

我正在制作一个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]
        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
调用,并在捕获异常时打印完整命令。