[英]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
。 例如, ls
、 cp
、 make
。 对此有什么建议吗?
跟进#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
位于错误的目录中一样。 脚本执行,但cp
和cd
抛出错误no such file or directory
。 如果我通过命令行导航到RunModels.scr
所在的位置并以老式方式执行它,我不会收到这些错误。
只要把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 可执行文件的完整路径。
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.