1

我尝试从 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%. 我什至尝试使用 parameter shell=True,但结果是一样的。

4

3 回答 3

2

我有同样的问题。这是我在 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 .bashrcor.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。这会打印输出,但不会将其发送回主进程。我需要将结果返回给调用程序,但这可能是另一个涉及输出管道和文件重定向的问题。

简而言之。这是一团糟,但脚本执行。当然,在某个地方有一种更一致的技术。

于 2015-08-14T18:33:48.087 回答
0

如果bash.exe路径中有空格,则使用子进程调用 bash 将不起作用。解决此问题的捷径是bash.exe在您的Path环境变量中添加。之后,您可以按如下方式执行 bash 脚本。

import subprocess

command = ['bash.exe', shell_script]
return_code = subprocess.call(command)
print('return code:' + str(return_code))
于 2019-10-25T19:11:31.933 回答
0

以下对我很有效:

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'])
于 2016-04-04T13:31:28.300 回答