繁体   English   中英

在 Windows 上执行来自 Python 的 bash 脚本

[英]Execute bash script from Python on Windows

我正在尝试编写一个 python 脚本,它将执行我的 Windows 机器上的 bash 脚本。 到目前为止,我一直在使用 Cygwin 终端,因此执行 bash 脚本 RunModels.scr 与./RunModels.scr一样简单。 现在我希望能够利用 Python 的subprocess进程,但是因为 Windows 没有处理 bash 的内置功能,我不知道该怎么做。

我正在尝试模拟./RunModels.scr < validationInput > validationOutput

我最初是这样写的:

os.chdir(atm)
vin = open("validationInput", 'r')
vout = open("validationOutput", 'w')
subprocess.call(['./RunModels.scr'], stdin=vin, stdout=vout, shell=True)
vin.close()
vout.close()
os.chdir(home)

但是在花了一段时间试图找出我的访问被拒绝的原因之后,我意识到我的问题不是文件权限,而是我试图在 Windows 上执行 bash 文件这一事实。 有人可以解释如何使用 python 脚本在 windows 上执行带有定向输入/输出的 bash 脚本吗?

编辑(跟进问题)

感谢您的回复,我需要 bash.exe 的完整路径作为第一个参数。 然而现在,来自 RunModels.scr 的命令行调用返回 python output as command not found 例如, lscpmake 对此有什么建议吗?

跟进#2 :我更新了我的电话:

subprocess.call(['C:\\cygwin64\\bin\\bash.exe', '-l', 'RunModels.scr'], stdin=vin, stdout=vout, cwd='C:\\path\\dir_where_RunModels\\')

我现在得到的错误是/usr/bin/bash: RunModels.scr: No such file or directory 使用 cwd 似乎对此错误没有任何影响,无论哪种方式,子进程都在/usr/bin/bash中查找RunModels.scr

自我回答我需要在调用中指定 RunModels.scr 的路径以及使用cwd

subprocess.call(['C:\\cygwin64\\bin\\bash.exe', '-l', 'C:\\path\\dir_where_RunModels\\RunModels.scr'], stdin=vin, stdout=vout, cwd='C:\\path\\dir_where_RunModels\\')

但是另一个问题...

无论指定cwd ,由RunModels.scr执行的命令都会抛出错误,就好像RunModels.scr位于错误的目录中一样。 脚本执行,但cpcd抛出错误no such file or directory 如果我通过命令行导航到RunModels.scr所在的位置并以老式方式执行它,我不会收到这些错误。

Python 3.4 及以下

只要把bash.exe在首位在您的列表subprocess.call参数。 您可以删除shell=True ,在这种情况下这不是必需的。

subprocess.call(['C:\\cygwin64\\bin\\bash.exe', '-l', 'RunModels.scr'], 
                 stdin=vin, stdout=vout,
                 cwd='C:\\path\\dir_where_RunModels\\')

根据 bash 的安装方式(是否在PATH ),您可能必须使用 bash 可执行文件的完整路径。

Python 3.5 及以上

subprocess.call()已经得到了有效的替代subprocess.run()

subprocess.run(['C:\\cygwin64\\bin\\bash.exe', '-l', 'RunModels.scr'], 
                 stdin=vin, stdout=vout,
                 cwd='C:\\path\\dir_where_RunModels\\')

编辑:

关于第二个问题,您可能需要在 shell 调用中添加-l选项以确保它读取所有重启命令文件,例如/etc/profile 我认为这些文件包含 bash 中$PATH设置。

编辑2:

将类似pwd添加到RunModels.scr的开头,以便您可以验证您确实位于正确的目录中。 检查 rc 文件中是否没有cd命令!

编辑3:

错误/usr/bin/bash: RunModels.scr: No such file or directory如果 bash 找不到脚本中调用的命令之一,则也无法生成/usr/bin/bash: RunModels.scr: No such file or directory 尝试将-v选项添加到 bash 以查看是否提供更多信息。

比接受的答案更好的解决方案是使用executable关键字参数来指定 shell 的路径。在幕后,Python 做了类似的事情

exec([executable, '-c`, subprocess_arg_string])

所以,具体来说,在这种情况下,

subprocess.call(
    './RunModels.scr',
    stdin=vin, stdout=vout,
    shell=True,
    executable="C:/cygwin64/bin/bash.exe")

(谢天谢地,Windows 允许您使用正斜杠而不是反斜杠,因此您可以避免使用双反斜杠或使用原始字符串的要求。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM