Windows环境下如何在Git Bash中通过Python调用Python脚本?
问题描述
在Windows环境中,我需要通过Python在Git Bash内运行Python文件。具体来说,我有一个Python编写的配置脚本,它需要调用其他Python脚本,但其中部分脚本使用了Unix命令,因此必须在Windows下通过Git Bash运行。
目前我使用的代码如下:
cmd = f'{sys.executable} mydependency.py' pipe = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE) # 后续会处理管道等待逻辑...
运行后报错:cannot execute binary file。
补充说明:mydependency.py实际上是simdjson项目中的amalgamate.py脚本。
我已尝试过以下操作但未解决:
- 改用
run或call替代subprocess.Popen - 使用
f'{git_bash_path} {sys.executable} mydependency.py'格式的命令 - 修改
Popen、run和call的shell及executable参数
解决方案
要在Windows的Git Bash环境中通过subprocess调用Python脚本,核心是让subprocess启动Git Bash并在其环境内执行命令,而非直接调用Windows的Python解释器。以下是可行的实现方式:
方法1:通过Git Bash的bash.exe执行命令
Git Bash的核心可执行文件是bash.exe(通常路径为C:\Program Files\Git\bin\bash.exe),需要用它来包裹整个命令,同时注意参数的传递格式:
import subprocess import sys # 替换为你的Git Bash中bash.exe的实际路径 git_bash_path = "C:\\Program Files\\Git\\bin\\bash.exe" # 构造在bash内执行的命令:调用Python解释器运行目标脚本 bash_command = f"{sys.executable} mydependency.py" # 通过bash.exe执行命令,-c参数用于传递要执行的命令字符串 pipe = subprocess.Popen( [git_bash_path, "-c", bash_command], stderr=subprocess.PIPE, stdout=subprocess.PIPE, text=True # 推荐添加,避免字节流处理问题 ) # 后续处理输出和等待 stdout, stderr = pipe.communicate() if pipe.returncode != 0: print(f"执行失败: {stderr}") else: print(f"执行输出: {stdout}")
关键注意事项
- 优先使用参数列表:使用subprocess时优先传递参数列表(而非拼接成单个字符串),避免路径或命令中含空格时出现解析错误。
- 加载Git Bash环境:目标脚本依赖的Unix命令(如
sed、awk等)只有在Git Bash的环境中才可用,必须通过bash.exe -c的方式执行命令,才能加载这些工具和对应的环境变量。 - 路径格式处理:如果脚本中涉及文件路径,Git Bash会自动将Windows风格路径(如
C:\dir)转换为Unix风格(如/c/dir);若脚本内有硬编码的Windows路径,可通过Git Bash内置的cygpath工具在命令中转换。
针对simdjson的amalgamate.py脚本的额外提示
amalgamate.py依赖Unix命令行工具,通过上述方式调用Git Bash执行时,Git Bash会自动加载自身的工具集(如usr/bin下的命令),无需额外配置PATH即可正常运行。
内容的提问来源于stack exchange,提问作者Marcel Pi
相关产品推荐
相关产品推荐

