Python 如何处理需要交互式响应的可执行文件?
我有一个名为tsfoil2.exe的可执行文件,我想从python环境中操作这个.exe。 我正在运行Python2.7.3,在Windows7上运行Spyder2.1.11 为了操作.exe,它需要一些输入、默认硬盘驱动器('I:\')、输出文件名('test')和输入文件名('SC20610.inp') 我的一位同事建议我使用os.system,并提供一个临时输入文件,其中包含所有参数Python 如何处理需要交互式响应的可执行文件?,python,windows,subprocess,os.system,Python,Windows,Subprocess,Os.system,我有一个名为tsfoil2.exe的可执行文件,我想从python环境中操作这个.exe。 我正在运行Python2.7.3,在Windows7上运行Spyder2.1.11 为了操作.exe,它需要一些输入、默认硬盘驱动器('I:\')、输出文件名('test')和输入文件名('SC20610.inp') 我的一位同事建议我使用os.system,并提供一个临时输入文件,其中包含所有参数 f = open('temp', 'w') f.write('I:\ \n') f.write('te
f = open('temp', 'w')
f.write('I:\ \n')
f.write('test \n')
f.write('SC20610.inp\n')
f.close()
然后,我以以下方式向该文件提供.exe的参数:
os.system("tsfoil2.exe < temp")
还有这个
import subprocess as sub
p=sub.Popen('tsfoil2.exe')
p.communicate(input='I:' )
但是,该程序不响应给定的参数
MWE:
导入操作系统
f=打开('temp','w')
f、 写入('I:\\n')
f、 写入('test\n')
f、 写入('SC20610.inp\n')
f、 关闭()
操作系统(“tsfoil2.exe
这两个程序都可以通过找到,输入文件可以通过找到
我希望一切都很清楚,您可以帮我解决。
按ENTER键退出“
表示程序需要换行符
我在temp
文件的末尾没有看到空行。此外,您可能指的是'I:\\\n'
——如果希望在输出中使用\
,则需要在Python字符串文本中使用'\\'
问题是tsfoil2.exe
如何考虑换行符,例如,b'\r\n'
或只是b'\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”。加入([“a”,“b”])==“a\nb”
每个进程可以有三个:stdin、stdout、stderr。在Python中,它们表示为sys.stdin
,sys.stdout
,sys.stderr
。您可以从标准输入读取输入并写入标准输出,例如,input
函数默认从标准输入读取并print
写入标准输出。stderr可用于写入错误消息
stdin=PIPE
告诉Popen
在调用它的父进程和新的子进程(“tsfoil2.exe”)之间创建一个管道,并重定向子进程的stdinp.communicate(data)
将数据写入p.stdin
,关闭它并等待子进程完成p.returncode
包含子进程的退出状态。通常非零状态意味着失败
它模拟shell管道,而不实际生成shell:
$ echo input data | tsfoil2.exe
如果需要直接从控制台输入,您可以尝试或使用其纯Python实现:
我还没有测试它。确保文件末尾有一个空行。第一个解决方案有效!你能再澄清一下它的工作方式吗?我自己也尝试过这样做,但没有成功。我也尝试了第二种解决方案,但它没有用.exe(即C:\Users\THC0LQ\Desktop\TSFOIL\tsfoil2.exe)查找所需的路径,而是搜索rC;ßUsersßTHC0LQßDesktopßTSFOILßtsfoil2.exe,由于某种原因,它会弄乱给定的字符串。@ROIMaison:我添加了“如何工作”部分。您应该为
SendKeys
函数使用原始字符串文字,以避免误解反斜杠(注意:r”““…”
)。手动输入“\”,以防复制粘贴尝试粘贴外观类似的Unicode字符而不是反斜杠。
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)
$ echo input data | tsfoil2.exe
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}
""")