我有一个名为idrag.exe的程序,完全基于命令行。它至少需要2个带引号的输入,'input.in'和'output.out',这两个输入都是自己执行的。input.in是之前创建的文件,output.out是程序写入的文件。我如何打开这个程序,输入"'input.in'"按回车键,输入"'output.out'"然后按回车键?我可以通过os.system打开这个程序,但我还没能让子进程正常工作。
我遇到的一个大问题是,一旦idrag.exe打开,我就无法输入。我知道我可以制作一个带有命令列表的.bat文件,但我不是在输入命令,而是在输入文本。
编辑。
对于那些感兴趣的人 这里是.exe的直接下载链接. 这里有一个 链接到一个示例输入文件
编辑2:
通常我运行idrag.exe,输入"'input.in'"按回车键,输入"'output.out'"按回车键,然后idrag计算它的东西,并将output.out写入当前目录。
编辑3(这个可能越来越过分了)。
这里有一个网站编译了一堆代码,你可以ctrl+f找到idrags部分。它包括所有3个fortran代码,可执行文件,和一堆样本inout文件。 我不希望有人真的去看所有的东西并尝试它,但它在这里,以防你感到无聊。
最终更新方案
呜呜,我们已经做到了,大家。原来有一个api可以让这样的事情变得简单! 它叫做pexpect。
from pexpect import popen_spawn
process = popen_spawn.PopenSpawn('idrag.exe')
process.sendline("'test1.in'")
process.sendline("'test1.out'")
注意:popen_spawn不会自动从pexpect中调用,所以你必须专门调用它。另外,由于unix的东西,windows上的语法和Mac上的略有不同。
就像其他人说的,如果'input.in'和'output.out'不改变,你可以直接做。
os.system('idrag.exe input.in output.out')
也许你的意思是你想用python指定输入和输出的值?
in_ = input("Enter input file name")
out_ = input("Enter output file name")
os.system(f'idrag.exe {in_} {out_}')
试试吧。
idrag.exe input.in output.out
在命令行里一次输入所有的值。
由于我不想下载一个EXE文件,我将尝试用一个Windows批处理文件来模拟上述EXE,要求输入两个字符串。
给定 "idrag.bat "为
@echo off
set /p foo=enter input file:
set /p bar=enter output file:
echo %date%>%bar%
echo %time%>>%bar%
echo %foo%>>%bar%
type %bar%
我们可以使用下面的python脚本将 "foo.txt "和 "bar.txt "传递给 "idrag.bat"
from subprocess import Popen, PIPE
process = Popen(["idrag.bat"], stdin=PIPE, stdout=PIPE, text=True)
print(process.communicate(input='foo.txt\nbar.txt\n')[0])
测试时,将对 "idrag.bat "的调用替换为 "idrag.exe"
有一个api可以让这样的事情变得简单!它叫pexpect。它叫做 pexpect。
from pexpect import popen_spawn
process = popen_spawn.PopenSpawn('idrag.exe')
process.sendline("'test1.in'")
process.sendline("'test1.out'")
注意:popen_spawn不会自动从pexpect中调用,所以你必须专门调用它。另外,由于unix的原因,windows上的语法和Mac上的略有不同。
试试
os.system("idrag.exe < 'input.in' < 'output.out'")
我认为问题是你想在程序运行后自动输入,这和输入命令行参数感觉是一样的,但技术上是不同的。
请看这里 疑问