我有同样的问题。这是我在 MinGW (msysgit) 中从 python 运行 shell 脚本的方法:
from subprocess import call
arg1 = 1
arg2 = 10
cmd = ['C:\\Program Files (x86)\\Git\\bin\\bash.exe', '-c', '~/bin/myscript', arg1, arg2]
result_code = call(cmd)
关键是明确拼出 bash.exe 的路径作为第一个参数,'-c'(命令)作为第二个参数,并使用脚本作为第三个参数。随后的参数进入脚本(有时 - 见下文)。
一些警告:
%PROGRAMFILES%
搜索 bash.exe 文件时,其他 Windows 变量无法解析——您可以通过使用 python 构建路径而不是硬编码名称来解决这个问题。
替换 ~ 为您的 mingw 主目录有效,PATH 变量 from .bashrc
or.profile
有效。如果您省略“-c”参数,您可以访问本地脚本(在 ~ 中),但“true”和“ls”等命令不存在 mingw 根文件结构。
例如,我还没有完全弄清楚何时组合参数以及何时不组合它们,这个命令有效:
cmd = ['C:\\Program Files (x86)\\Git\\bin\\bash.exe', '-c', 'echo hi']
result_code = call(cmd)
但这不是:
cmd = ['C:\\Program Files (x86)\\Git\\bin\\bash.exe', '-c', 'echo', 'hi']
result_code = call(cmd)
但是,使用我的 shell 脚本,这是可行的:
cmd = ['C:\\Program Files (x86)\\Git\\bin\\bash.exe', '-c', '~bin/myscript', arg1, arg2]
result_code = call(cmd)
但这不是:
cmd = ['C:\\Program Files (x86)\\Git\\bin\\bash.exe', '-c', '~bin/myscript 1 10']
result_code = call(cmd)
在所有情况下,对于成功执行 bash.exe,result_code 都是 0。我不知道如何将脚本的输出返回给 python。这会打印输出,但不会将其发送回主进程。我需要将结果返回给调用程序,但这可能是另一个涉及输出管道和文件重定向的问题。
简而言之。这是一团糟,但脚本执行。当然,在某个地方有一种更一致的技术。