我遇到了以下错误:
WindowsError: [Error 2] The system cannot find the file specified
我的代码是:
subprocess.call(["<<executable file found in PATH>>"])
我使用的是Windows 7 64位操作系统,Python版本是最新稳定版的3.x。
有什么想法吗?
谢谢。
我遇到了以下错误:
WindowsError: [Error 2] The system cannot find the file specified
我的代码是:
subprocess.call(["<<executable file found in PATH>>"])
我使用的是Windows 7 64位操作系统,Python版本是最新稳定版的3.x。
有什么想法吗?
谢谢。
如果命令是一个shell内置命令,在调用时需要添加shell=True
选项。
例如,对于dir
命令,您应该键入:
import subprocess
subprocess.call('dir', shell=True)
引用自文档:
在 Windows 系统下,只有当你要执行的命令是内置于 shell 中(例如 dir 或 copy)时,才需要指定
shell=True
。运行批处理文件或基于控制台的可执行程序不需要使用shell=True
。
dir.exe
的可执行文件,而有一个/bin/ls
。dir
由_CMD.EXE_实现,就像cd
由_bash_实现一样。 - Apalalaos.environ
获取PATH
并手动搜索它。 - asmeurersubprocess
模块不会查找PATH
路径,除非你传递shell=True
参数,因为它在背后使用CreateProcess()
。然而,如果你正在传递可能来自程序外部的参数,shell=True
可能会带来安全风险。为了让subprocess
仍能够找到正确的可执行文件,你可以使用shutil.which
。假设你的PATH
路径中的可执行文件名为frob
:subprocess.call([shutil.which('frob'), arg1, arg2])
(这适用于 Python 3.3 及以上版本。)
from distutils.spawn import find_executable as which
。这行代码是从 pre-commit 的钩子脚本中复制的。 - Allan Chainshell=True
也会检查 PATH
,但 shell 内置命令(如 cd
和 dir
)不在 PATH
上,因为它们根本不是可执行文件。这就是内置于 shell 中的含义;该命令由 shell 自身理解和执行,并不存在作为单独二进制文件的存在。 - tripleeesubprocess.call(['cmd', '/c', 'dir'])
/c指示cmd运行紧随其后的命令
这比使用shell=True更安全,因为shell=True存在shell注入的风险。
/k
而不是/c
。在命令行中输入cmd /?
以获取详细信息。 - User5910shell=True
的绕路方式。 - tripleeesubprocess.call(['powershell','-command','dir'])
。 PowerShell支持大部分POSIX命令。在经过一番思考之后,我发现在64位机器上运行32位Python时,运行位于C:\Windows\System32\的文件可能会出现潜在问题,这是由于Windows试图智能地处理进程,并将调用重定向到C:\Windows\SysWOW64。
我在这里找到了一个解决方法的示例:http://code.activestate.com/recipes/578035-disable-file-system-redirector/
在调用 PHP 时,我遇到了同样的问题。原因是 PHP 没有在 PATH 中,所以找不到 PHP 命令。但 PowerShell 发现它存在于当前位置,并建议如果我信任此命令,则替换 'PHP' 为 '.\PHP'。然后它运行良好。
引用文档中的内容:
“在 Python 3.5 之前,这三个函数构成了 subprocess 的高级 API。现在你可以在许多情况下使用 run(),但是很多现有代码调用了这些函数。”
所以:在 Python 3.5 及以上版本中,不再使用 subprocess.call,而是使用 subprocess.run。