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(否则没有命令使其退出)可能会发生死锁。
我正在为 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(否则没有命令使其退出)可能会发生死锁。