stdin.write() 被阻止与 foil.exe 互动

stdin.write() being blocked from interacting with foil.exe

我正在为 Xfoil 编写一个包装器,我的第一个命令集是:

commands=[]

commands.append('plop\n')
commands.append('g,f\n')
commands.append('\n')
commands.append('load '+ afile+'\n')
commands.append('\n')
#commands.append('ppar\n');
#commands.append('n %g\n',n);
commands.append('\n')
commands.append('\n')
commands.append('oper\n')
commands.append('iter '+ str(iter) + '\n')
commands.append('visc {0:f}\n'.format(Re))
commands.append('m {0:f}\n'.format(M))

我正在与 xfoil 进行如下交互:

xfoil_path=os.getcwd()+'/xfoil.exe'
Xfoil = Popen(xfoil_path, shell=True, stdin=PIPE, stdout=None, stderr=None, creationflags=0)
for i in commands:
    print '\nExecuting:', i
    #stdin.write returns None if write is blocked and that seems to be the case here
    Xfoil.stdin.write(i)
    Xfoil.wait()
    #print Xfoil.stdin.write(i)

但是,Xfoil.stdin.write 被阻止与程序交互 -- xfoil.exe -- 作为 Xfoil.stdin.write(i) returns a None。

这会在第一个命令后立即发生,即 plop

我该如何解决这个问题?

解决方法是添加Xfoil.stdin.close();关闭缓冲区允许程序继续。

Xfoil = Popen(xfoil_path, shell=True, stdin=PIPE, stdout=None, stderr=None, creationflags=0)
for i in commands:
    Xfoil.stdin.write(i)

Xfoil.stdin.close()
Xfoil.wait()

寻求帮助理解为什么需要添加Xfoil.stdin.close()。关闭缓冲区如何允许 xfoil.exe 继续?

要发送多个命令,您可以 use Popen.communicate() method 发送命令、关闭管道并等待子进程完成:

import os
from subprocess import Popen, PIPE

process = Popen(os.path.abspath('xfoil.exe'), stdin=PIPE)
process.communicate(b"".join(commands))

Xfoil.wait() 在您的代码中等待可执行文件在第一个命令后完成。关闭管道 (Xfoil.stdin) 表示 EOF,否则如果 xfoil.exe 读取直到 EOF(否则没有命令使其退出)可能会发生死锁。