这可能很简单,但很长一段时间我都收到了这个错误!
在Windows和python 2.7上
导入子流程
p = subprocess.Popen([" C:\ Program Files \ Google \ Cloud SDK \谷歌云-SDK \ BIN \ BQ"])
追踪(最近一次通话): 文件"",第1行,in 文件" C:\ Python27 \ lib \ subprocess.py",第710行, init errread,errwrite) 文件" C:\ Python27 \ lib \ subprocess.py",第958行,在_execute_child中 STARTUPINFO) WindowsError:[错误2]系统找不到指定的文件
当我使用bq从命令提示符正常运行时,它运行得很好。 我错过了subprocess和bq。
由于
编辑: 在尝试了下面提供的几个解决方案后,我发现当我使用" shell = True"大多数命令都适用于Windows shell!
例如:p = subprocess.Popen(' dir',shell = True)
答案 0 :(得分:2)
错误消息显示,它无法找到您指定的可执行文件。这很可能是由使用反斜杠(\
)引起的。反斜杠转义Python字符串中的字符。您可以将\
替换为\\
或替换为/
。此外,您应该添加文件扩展名.cmd
。试试这个:
p = subprocess.Popen(["C:/Program Files/Google/Cloud SDK/google-cloud-sdk/bin/bq.cmd"])
答案 1 :(得分:2)
您需要提供全名,包括文件扩展名,例如
from subprocess import Popen
p = Popen(r"C:\Program Files\Google\Cloud SDK\google-cloud-sdk\bin\bq.exe")
注意:最后.exe
。
r''
- 原始字符串文字用于避免在Windows路径中转义反斜杠。
注意:如果r"C:\Program Files\Google\Cloud SDK\google-cloud-sdk\bin
位于%PATH%
,那么您可以使用p = Popen("bq")
。见Popen with conflicting executable/path
注意:如果实际的bq
文件名以.cmd
as @Antonio suggests结尾,则CreateProcess()
)Popen()
cmd.exe
使用的Windows函数除非您明确指定文件扩展名,否则将找不到它。如果你使用shell(%PATHEXT%
);它使用不同的规则(例如,枚举bq.cmd
as said in the link),因此即使您只提供bq
,它也可能会找到.cmd
(假设%PATHEXT%
位于dir
1}})。
尝试使用下面提供的几个解决方案后,我发现当我使用“shell = True”时,大多数命令都适用于Windows shell!
dir
是一个内部shell命令。除非有其他shell=True
程序;如果没有cmd.exe
在Windows上启动%COMSPEC%
(shell=True
),它将无效。某些命令与shell=False
一起使用并且在没有它的情况下似乎失败的原因是由于与{{1}}情况(默认值)相比,用于查找可执行文件的规则不同。这些规则列举为as said in the link。
答案 2 :(得分:2)
使用以下其中一项:
from subprocess import Popen
p = Popen(["C:/Program Files/Google/Cloud SDK/google-cloud-sdk/bin/bq.cmd"])
p = Popen([r"C:\Program Files\Google\Cloud SDK\google-cloud-sdk\bin\bq.cmd"])
Google Cloud SDK for Windows中的bq可执行文件称为bq.cmd。从命令行调用它时,cmd将自动查找.cmd扩展名,而python解释器则不会。