从Python运行bash脚本,但得到Windows错误193

从Python运行bash脚本,但得到Windows错误193,python,shell,call,windowserror,Python,Shell,Call,Windowserror,我试着从Python运行shell脚本,但是我得到了 WindowsError: [Error 193] %1 is not a valid Win32 application 我的简化代码如下: import subprocess subprocess.call(["%s/scripts/test.sh"%work_path, "arg1", "arg2"]) 奇怪的是,这在Linux上运行得很顺利 test.sh在头文件中具有指向bash的有效路径,bash可执行文件包含在%path%中

我试着从Python运行shell脚本,但是我得到了

WindowsError: [Error 193] %1 is not a valid Win32 application
我的简化代码如下:

import subprocess
subprocess.call(["%s/scripts/test.sh"%work_path, "arg1", "arg2"])
奇怪的是,这在Linux上运行得很顺利


test.sh
在头文件中具有指向bash的有效路径,bash可执行文件包含在
%path%
中。我甚至尝试使用参数
shell=True
,但结果是一样的。

我也遇到了同样的问题。以下是我在MinGW(msysgit)中运行python shell脚本的方法:

关键是将bash.exe的路径作为第一个参数显式拼写出来,第二个参数为“-c”(command),第三个参数使用脚本。随后的参数将转到脚本(有时--请参见下文)

一些警告:

%PROGRAMFILES%
和其他windows变量在搜索bash.exe文件时无法解析——您可以通过使用python构造路径而不是硬编码名称来解决这一问题

将~替换为mingw主目录有效,并且
.bashrc
.profile
中的路径变量有效。如果省略“-c”参数,则可以访问本地脚本(在~),但对于“true”和“ls”等命令,不存在mingw根文件结构

我还没有完全弄清楚什么时候合并参数,什么时候不合并参数。例如,这个命令可以工作:

cmd=['C:\\ProgramFiles(x86)\\Git\\bin\\bash.exe','-C',echo hi']
结果\u代码=调用(cmd)

但这并不是:

cmd=['C:\\ProgramFiles(x86)\\Git\\bin\\bash.exe','-C',echo',hi']
结果\u代码=调用(cmd)

但是,对于我的shell脚本,这是可行的:

cmd=['C:\\Program Files(x86)\\Git\\bin\\bash.exe','-C','~bin/myscript',arg1,arg2]
结果\u代码=调用(cmd)

但这并不是:

cmd=['C:\\Program Files(x86)\\Git\\bin\\bash.exe','-C','~bin/myscript 110']
结果\u代码=调用(cmd)

在所有情况下,成功执行bash.exe的结果_代码均为0。我不知道如何将脚本的输出返回到python。这会打印输出,但不会将其发送回主进程。我需要将结果返回给调用程序,但这可能是涉及输出管道和文件重定向的另一个问题


简而言之。这是一个完全的混乱,但脚本执行。当然,在某些地方有一种更为一致的方法。

以下方法对我很有效:

import platform, os, subprocess

if platform.system() == 'Windows':
    programfiles = ('PROGRAMW6432' if platform.architecture()[0] == '32bit'
                    else 'PROGRAMFILES')
    bash_exe = os.getenv(programfiles) + r'\Git\bin\bash'
    subprocess.call([bash_exe, '-c', 'echo hello'])

如果在
bash.exe
path中有一个空格,那么使用子流程调用bash将不起作用。解决此问题的快捷方式是在Path环境变量上添加
bash.exe
。在此之后,您可以执行bash脚本,如下所示

import subprocess

command = ['bash.exe', shell_script]
return_code = subprocess.call(command)
print('return code:' + str(return_code))

脚本是否在CMD.exe或powershell中正常运行?您如何期望shell脚本(sh、ksh、bash)能够在Windows中运行?哦,对不起,我忘了提到,Windows计算机上安装了MinGW。我从未使用过MinGW,但我猜您需要调用shell(bash,我猜)与脚本一起执行。错误消息看起来像是一个批处理文件在某个地方拦截了您。您能否验证
work\u path
是否包含您想要的路径,如果没有,请找出是什么弄乱了它?
import subprocess

command = ['bash.exe', shell_script]
return_code = subprocess.call(command)
print('return code:' + str(return_code))