我正在尝试编写一个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.exe
放在subprocess.call
参数列表的第一位。您可以删除shell=True
,在这种情况下这是不必要的。根据bash的安装方式(是否在
PATH
中),您可能必须使用bash可执行文件的完整路径。编辑:
关于第二个问题,您可能需要将
-l
选项添加到shell调用中,以确保它读取所有重启命令文件,如/etc/profile
。我假设这些文件包含bash中$PATH
的设置。编辑2:
在
RunModels.scr
的开头添加类似pwd
的内容,这样就可以验证您是否真的在正确的目录中。检查rc文件中是否没有cd
命令!编辑3:
如果bash找不到脚本中调用的命令之一,也会生成错误
/usr/bin/bash: RunModels.scr: No such file or directory
。尝试将-v
选项添加到bash,以查看是否提供了更多信息。相关问题 更多 >
编程相关推荐