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

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

我有一个名为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('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”)之间创建一个管道,并重定向子进程的stdin
p.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}
""")