微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何处理需要交互式响应的可执行文件?

我有一个名为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 。

我希望一切都清楚,你可以帮助我。

文件将子文件夹中的.js文件合并到一个组合文件

删除2级子文件夹,但保留1级子文件

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} """)

我没有测试过。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐