我有一个名为tsfoil2.exe的可执行文件,我想从我的python环境中运行这个.exe文件。 我正在运行Python 2.7.3,在Windows 7上运行Spyder 2.1.11。
为了运行.exe,它需要一些input,默认硬盘驱动器('I:'),输出文件的名称('test')以及input文件的名称('SC20610.inp') 。
我的一位同事build议我使用os.system,并提供一个包含所有参数的临时input文件。
f = open('temp','w') f.write('I: n') f.write('test n') f.write('SC20610.inpn') f.close()
然后,我以下面的方式将这个文件的参数提供给.exe:
使用Python自动进行stream程监控/pipe理
子域名在不改变地址栏中的URL的情况下使用htaccessredirect
如何在默认程序中启动文件,然后在脚本结束时closures文件?
Popen冲突的可执行文件/path
如何在Python中重用Popen的中间结果?
os.system("tsfoil2.exe < temp")
这一切工作,但程序需要一个“ENTER”closures。 由于某种原因,.exe被反复询问'按ENTER键退出'。 即使在我的Spyder控制台中按下回车键,程序也不会终止。
有没有办法让“ENTER”键作为交互式input到.exe? 我试图使用SendKeys类,但是因为程序不终止,所以它没有到达包含SendKeys命令的代码行。 我也试图将它包含在参数文件中,但是这也不起作用。
此外,我还发现切换到subprocess命令可能是有益的,因为它可能会给我更多的执行命令,但是我还没有能够使用input文件运行可执行文件。
是否可以使用os.system提供必要的“确认”,或者我应该切换到subprocess,如果是这样,我怎样才能构build一个类似于os.system(“tsfoil2.exe <temp”)的方法现在使用。
我试过这个:
import subprocess as sub f = open('temp','w') f.write('I: n') f.write('test n') f.write('SC20610.inpn') f.close() proc=sub.Popen(["tsfoil2.exe","temp"],shell=True)
和这个
import subprocess as sub p=sub.Popen('tsfoil2.exe') p.communicate(input='I:' )
但是,该程序没有回应给出的论据。
MWE:
import os f = open('temp','w') f.write('I: n') f.write('test n') f.write('SC20610.inpn') f.close() os.system("tsfoil2.exe < temp")
这两个程序可以通过http://www.dept.aoe.vt.edu/~mason/Mason_f/tsfoil2.exefind,input文件可以通过http://www.dept.aoe.vt.edufind/〜mason / Mason_f / SC20610.inp 。
我希望一切都清楚,你可以帮助我。
python + windows:运行exe,就好像它与当前进程无关
如何限制python中的subprocessstdout和stderr的大小
process.communicate和getche()失败
'Press the ENTER key to exit'表示程序需要换行符。
在temp文件末尾看不到空行。 另外,你可能意思是'I:\n' – 如果你希望在输出中使用'\'你需要在Python字符串中使用'\' 。
问题是什么tsfoil2.exe认为一个换行符,例如b'rn'或只是b'n' ,并且它希望从stdin( getchar() )或直接从控制台( getch() )接收它。
假设程序期望从Windows上的标准输入b'rn' :
import os from subprocess import CalledProcessError,Popen,PIPE cmd = "tsfoil2.exe" input_data = os.linesep.join(['I:\','test','SC20610.inp',os.linesep]) p = Popen(cmd,stdin=PIPE,bufsize=0) p.communicate(input_data.encode('ascii')) if p.returncode != 0: raise CalledProcessError(p.returncode,cmd)
怎么运行的
在Windows上os.linesep == "rn" 。 "n".join(["a","b"]) == "anb" 。
每个进程可能有三个标准流 :stdin,stdout,stderr。 在Python中,它们表示为sys.stdin , sys.stdout , sys.stderr 。 你可以从stdin读取输入并写入标准输出stderr,例如, input函数从标准input读取,并默认print写入标准输出。 stderr可能被用来写错误信息。
stdin=PIPE告诉Popen在被调用的父进程和新的子进程(“tsfoil2.exe”)之间创建一个管道,并重定向子进程的stdin。 p.communicate(data)将数据写入p.stdin ,关闭它并等待子进程完成。 p.returncode包含子进程的退出状态。 通常非零状态意味着失败。
它模拟了shell管道而没有实际产生shell:
$ echo input data | tsfoil2.exe
如果希望直接从控制台输入,则可以尝试SendKeys模块或其纯Python实现SendKeys-ctypes :
from SendKeys import SendKeys SendKeys(r""" {LWIN} {PAUSE .25} r C:PathTotsfoil2.exe{ENTER} {PAUSE 1} I:{ENTER} {PAUSE 1} test{ENTER} {PAUSE 1} SC20610.inp{ENTER} {PAUSE 1} {ENTER} """)
我没有测试过。