【问题标题】:subprocess - FileNotFoundError when shell=False子进程 - 当 shell=False 时出现 FileNotFoundError
【发布时间】:2016-10-29 16:30:08
【问题描述】:

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


    【解决方案1】:

    那是因为echo 是 Windows 中的内置命令,而不是可执行文件。您必须启用shell=True 以使其工作。

    (或添加 shell 前缀,例如 bash -ccmd /c,具体取决于您的操作系统)

    在 Windows 上为您服务:有效:

    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 调用,并在捕获异常时打印完整的命令。
    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 2021-09-16
    • 2019-05-06
    • 2017-08-22
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多