Windows在subprocess.call()上找不到文件


103

我收到以下错误:

WindowsError: [Error 2] The system cannot find the file specified

我的代码是:

subprocess.call(["<<executable file found in PATH>>"])

Windows 7,64位。Python 3.x最新,稳定。

有任何想法吗?

谢谢,


这个可执行文件是什么?
SilentGhost 2010年

Android SDK中的“Android”的可执行文件的一部分
斯里兰卡

2
并且是可在PATH
斯里兰卡

您可以从命令行运行它吗?
SilentGhost

我要完成的工作的一些背景知识。这是针对Opendevice的-一个开源项目,用于将HTML5应用程序转换为设备特定的应用程序。我试图取代使用os.system()bitbucket.org/srirangan/opendevice/src/tip/tools/net/srirangan/...到subprocess.call()
斯里兰卡

Answers:


178

当命令是内置的shell时,请在调用中添加“ shell = True”。

例如,dir您将输入:

import subprocess
subprocess.call('dir', shell=True)

引用文档:

在Windows上唯一需要指定shell = True的时间是将要执行的命令内置到shell中(例如dir或copy)。您不需要shell = True即可运行批处理文件或基于控制台的可执行文件。


14
这是因为没有可执行文件,称为dir.exe虽然有一个/bin/ls在* nix中。dirCMD.EXE实现,就像cdbash实现。
2011年

1
强烈建议不要这样做。docs.python.org/2/library/…–
珠穆朗玛峰,

11
@nueverest仅当从外部输入构造命令字符串
Jirka

另一种方法(更安全的外部输入)是获得PATH来自os.environ和手动搜索。
asmeurer's

有关此问题的更合适的解决方案,请参见stackoverflow.com/a/32799942/3912576
SimonBiggs

33

在Windows上,我相信除非您通过subprocessPATH否则shell=True模块不会进入,因为它CreateProcess()在后台使用。但是,shell=True如果传递的参数可能来自程序外部,则可能存在安全风险。为了subprocess仍然能找到正确的可执行文件,你可以使用shutil.which。假设您中的可执行文件PATH名为frob

subprocess.call([shutil.which('frob'), arg1, arg2])

(这适用于Python 3.3及更高版本。)


4
任何python 2选项?
Naramsim

1
您是对的,并且您在建议正确的修复方法。这个答案应该被接受。当前接受的答案并未说明原因,而是提出了在某些情况下可能很危险的修复方法。
David FerenczyRogožan19年

18

在Windows上,您必须通过cmd.exe进行调用。如Apalala所述,Windows命令不是作为单独的可执行文件在cmd.exe中实现的。

例如

subprocess.call(['cmd', '/c', 'dir'])

/ c告诉cmd运行以下命令

这比使用shell = True(允许shell注入)更安全。


我如何保持屏幕打开?
Moondra's

2
@Moondra,如果我对您的理解正确,请尝试/k代替/ccmd /?在命令行输入以获取详细信息。
User5910

@ User5910谢谢。如果有机会,请尝试一下。
Moondra

3

如果您使用的是Powershell,则将在其中subprocess.call(['powershell','-command','dir'])。Powershell支持大部分POSIX命令


2

经过大量的抓挠之后,我发现在64位计算机上运行32位版本的python时,运行位于C:\ Windows \ System32 \中的文件是一个潜在的问题,这是由于Windows试图使该过程变得更智能,以及将对C:\ Windows \ System32的调用重定向到C:\ Windows \ SysWOW64。

我在这里找到了如何解决此问题的示例:http : //code.activestate.com/recipes/578035-disable-file-system-redirector/


1

引用文档:

“在Python 3.5之前,这三个函数包含用于子过程的高级API。您现在可以在许多情况下使用run(),但是许多现有代码都调用了这些函数。”

因此:对于Python 3.5及更高版本,请使用subprocess.run而不是subprocess.call


真实而有用。
Erick G. Hagstrom

0

在调用PHP时遇到了相同的问题。原因是PHP不在PATH中,所以找不到命令PHP。但是PowerShell发现它确实存在于当前位置,如果我信任此命令,建议将“ PHP”替换为“。\ PHP”。然后运行良好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.