我有一个可执行文件,名为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找到。在
我希望一切都清楚,你能帮助我。在
'Press the ENTER key to exit'
表示程序需要换行符。在我在
temp
文件的末尾没有看到空白行。另外,您可能是指'I:\\\n'
如果您希望在输出中使用\
,那么您需要在Python字符串文本中使用'\\'
。在问题是},以及它希望在哪里接收它:从stdin(
tsfoil2.exe
认为新行是什么,例如,b'\r\n'
或者仅仅是{getchar()
)还是直接从控制台(getch()
)。在假设程序期望Windows上的stdin提供
b'\r\n'
:工作原理
os.linesep == "\r\n"
在Windows上。"\n".join(["a", "b"]) == "a\nb"
。在每个进程可以有三个standard streams:stdin、stdout、stderr。在Python中,它们表示为
sys.stdin
,sys.stdout
,sys.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实现^{} :
我还没有测试过。在
相关问题 更多 >
编程相关推荐