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

2024-10-03 23:26:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个可执行文件,名为tsfoil2.exe,我想从python环境中操作这个.exe。 我运行的是python2.7.3,在windows7上运行spyder2.1.11。在

为了操作.exe,它需要一些输入、默认硬盘驱动器(“I:\”)、输出文件的名称(“test”)和输入文件的名称(“SC20610.inp”)。在

我的一个同事建议我使用操作系统,并为其提供一个临时输入文件,该文件包含所有参数。在

f = open('temp', 'w') 
f.write('I:\ \n') 
f.write('test \n')
f.write('SC20610.inp\n')  
f.close() 

然后,我按以下方式向该文件提供.exe的参数:

^{pr2}$

这一切正常,但程序需要“回车”才能关闭。由于某些原因,.exe反复请求“按ENTER键退出”。即使在我的Spyder控制台中按enter键,程序也不会终止。在

有没有办法把“回车”键作为交互式输入给.exe? 我尝试过使用SendKeys类,但是由于程序没有终止,它无法到达包含SendKeys命令的代码行。 我也尝试在参数文件中包含它,但这也不起作用。在

此外,我还发现切换到subprocesses命令可能会有好处,因为它可能会在执行过程中给我更多的命令,但我无法使用输入文件运行可执行文件。在

是否可以使用操作系统,或者应该切换到子进程,如果是,如何构造类似于操作系统(“tsfoil2.exe<;temp”)我现在正在使用。

我试过了:

import subprocess as sub
f = open('temp', 'w') 
f.write('I:\ \n') 
f.write('test \n')
f.write('SC20610.inp\n')  
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.inp\n')  
f.close() 

os.system("tsfoil2.exe < temp")

两个程序都可以通过http://www.dept.aoe.vt.edu/~mason/Mason_f/tsfoil2.exe找到,输入文件可以通过http://www.dept.aoe.vt.edu/~mason/Mason_f/SC20610.inp找到。在

我希望一切都清楚,你能帮助我。在


Tags: 文件testimport命令程序可执行文件close参数
1条回答
网友
1楼 · 发布于 2024-10-03 23:26:09

'Press the ENTER key to exit'表示程序需要换行符。在

我在temp文件的末尾没有看到空白行。另外,您可能是指'I:\\\n'如果您希望在输出中使用\,那么您需要在Python字符串文本中使用'\\'。在

问题是tsfoil2.exe认为新行是什么,例如,b'\r\n'或者仅仅是{},以及它希望在哪里接收它:从stdin(getchar())还是直接从控制台(getch())。在

假设程序期望Windows上的stdin提供b'\r\n'

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)

工作原理

os.linesep == "\r\n"在Windows上。"\n".join(["a", "b"]) == "a\nb"。在

每个进程可以有三个standard streams:stdin、stdout、stderr。在Python中,它们表示为sys.stdinsys.stdoutsys.stderr。您可以从stdin读取输入并写入stdout,stderr例如,input函数从stdin读取,print写入stdout。stderr可用于编写错误消息。在

stdin=PIPE告诉Popen在调用它的父进程和新的子进程(“tsfoil2.exe”)之间创建一个管道,并重定向子进程的stdin。p.communicate(data)将数据写入p.stdin,关闭它并等待子进程完成。p.returncode包含子进程的退出状态。通常非零状态意味着失败。在

它模拟shell管道而不实际生成shell:

^{pr2}$

如果需要直接从控制台输入,可以尝试^{} module或其纯Python实现^{}

from SendKeys import SendKeys

SendKeys(r"""
    {LWIN}
    {PAUSE .25}
    r
    C:\Path\To\tsfoil2.exe{ENTER}
    {PAUSE 1}
    I:\{ENTER}
    {PAUSE 1}
    test{ENTER}
    {PAUSE 1}
    SC20610.inp{ENTER}
    {PAUSE 1}
    {ENTER}
""")

我还没有测试过。在

相关问题 更多 >