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