在Windows

时间:2017-01-14 00:21:38

标签: python windows bash

我正在尝试编写一个python脚本,它将执行我在Windows机器上的bash脚本。到目前为止,我一直在使用Cygwin终端,因此执行bash脚本RunModels.scr就像./RunModels.scr一样简单。现在我希望能够利用subprocess的Python,但由于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中的命令行调用以command not found的形式返回到python输出中。例如,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

SELF-ANSWERED 我需要在调用中指定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\\')

但是另一个问题......

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

1 个答案:

答案 0 :(得分:3)

只需将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可执行文件的完整路径。

修改

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

编辑2:

pwd之类的内容添加到RunModels.scr的开头,以便您可以在正确的目录中验证您 。检查rc-files中没有cd命令!

编辑3:

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