我收到以下错误:
WindowsError: [Error 2] The system cannot find the file specified
我的代码是:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7,64位。 Python 3.x最新,稳定。
有什么想法吗?
谢谢,
答案 0 :(得分:149)
答案 1 :(得分:20)
在Windows上,我认为subprocess
模块不会查看PATH
,除非您通过shell=True
。但是,如果您传递可能来自程序外部的参数,shell=True
可能会带来安全风险。要使subprocess
能够找到正确的可执行文件,您可以使用shutil.which
。假设PATH
中的可执行文件名为frob
:
subprocess.call([shutil.which('frob'), arg1, arg2])
(这适用于Python 3.3及更高版本。)
答案 2 :(得分:13)
在Windows上,您必须通过cmd.exe进行调用。正如Apalala所提到的,Windows命令在cmd.exe中实现,而不是作为单独的可执行文件实现。
e.g。
subprocess.call(['cmd', '/c', 'dir'])
/ c告诉cmd运行以下命令
这比使用shell = True更安全,它允许shell注入。
答案 3 :(得分:2)
如果您使用的是PowerShell,那么它将是subprocess.call(['powershell','-command','dir'])
。 Powershell支持大部分POSIX命令
答案 4 :(得分:1)
经过大量的抓挠之后,我发现在64位计算机上运行python的32位版本时,运行位于C:\ Windows \ System32 \中的文件是一个潜在的问题,这是由于Windows试图使智能处理,然后将对C:\ Windows \ System32的调用重定向到C:\ Windows \ SysWOW64。
我在这里找到了如何解决此问题的示例: http://code.activestate.com/recipes/578035-disable-file-system-redirector/
答案 5 :(得分:0)
要引用文档中的内容:
“在Python 3.5之前,这三个函数包含用于子过程的高级API。现在,在许多情况下都可以使用run(),但是许多现有代码都调用了这些函数。”
SO:对于Python 3.5及更高版本,请使用subprocess.run而不是subprocess.call
答案 6 :(得分:0)
我在调用PHP时遇到了同样的问题。原因是PHP不在PATH中,所以找不到命令PHP。但是PowerShell发现它确实存在于当前位置,如果我信任此命令,建议将“ PHP”替换为“。\ PHP”。然后运行良好。