【发布时间】:2017-05-29 11:07:04
【问题描述】:
我正在尝试编写一个 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 输出中返回为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脚本,需要显式调用bash命令:全路径使用Windows路径语法。
-
注意:打开文件时最好使用
with语句。这样你就可以防止在引发异常时让它们保持打开状态。