import subprocess
proc = subprocess.Popen('git status')
print 'result: ', proc.communicate()
我的系统路径中有git,但是当我像这样运行子进程时,我得到:
WindowsError: [Error 2] The system cannot find the file specified
如何让subprocess在系统路径中找到git?
Windows XP上的Python 2.6。
答案 0 :(得分:8)
您在此处看到的问题是,由底层流程使用的Windows API函数CreateProcess不会自动解析除.exe
之外的其他可执行扩展。在Windows上,'git'命令实际上安装为git.cmd
。因此,您应该修改示例以显式调用git.cmd
:
import subprocess
proc = subprocess.Popen('git.cmd status')
print 'result: ', proc.communicate()
git
shell==True
的原因是{shell}会自动将git
解析为git.cmd
。
import subprocess
import os.path
def resolve_path(executable):
if os.path.sep in executable:
raise ValueError("Invalid filename: %s" % executable)
path = os.environ.get("PATH", "").split(os.pathsep)
# PATHEXT tells us which extensions an executable may have
path_exts = os.environ.get("PATHEXT", ".exe;.bat;.cmd").split(";")
has_ext = os.path.splitext(executable)[1] in path_exts
if not has_ext:
exts = path_exts
else:
# Don't try to append any extensions
exts = [""]
for d in path:
try:
for ext in exts:
exepath = os.path.join(d, executable + ext)
if os.access(exepath, os.X_OK):
return exepath
except OSError:
pass
return None
git = resolve_path("git")
proc = subprocess.Popen('{0} status'.format(git))
print 'result: ', proc.communicate()
答案 1 :(得分:1)
你的意思是
proc = subprocess.Popen(["git", "status"], stdout=subprocess.PIPE)
subprocess.Popen
的第一个参数采用shlex.split
- 类似的参数列表。
或:
proc = subprocess.Popen("git status", stdout=subprocess.PIPE, shell=True)
不推荐这样做,因为您正在启动shell,然后在shell中启动进程。
此外,您应该使用stdout=subprocess.PIPE
来检索结果。
答案 2 :(得分:0)
请注意,到2020年,使用Git 2.28(2020年第三季度)时,将不再支持Python 2.6或更早版本。
请参见commit 45a87a8的Denton Liu (Denton-L
)(2020年6月7日)。
(由Junio C Hamano -- gitster
--在commit 6361eb7中合并,2020年6月18日)
CodingGuidelines
:指定Python 2.7是最旧的版本签名人:刘登顿
在0b4396f068中(“
git-p4
:使python2.7成为受支持的最旧版本”,2019-12-13,Git v2.27.0-rc0-merge在{{ 3}}),git-p4已更新为仅支持2.7及更高版本。由于Python 2.6几乎是很古老的历史,因此更新CodingGuidelines以显示2.7是受支持的最旧版本。
答案 3 :(得分:-2)
我相信你需要将env
传递给Popen,例如:
import subprocess, os
proc = subprocess.Popen('git status', env=os.environ, stdout=subprocess.PIPE)
应该做的伎俩。