2017-03-27 37 views
0

我想運行一個命令行,通過python腳本調用xfoil。我首先在python 2.7中編寫它,但爲了以後的工作,我需要在3.7中重寫它。 我正在做的是,通過寫入sdtin將一串字符串命令傳遞給cli工具xfoil。這適用於python 2.7,但不適用於3.6。我在兩個都得到退出代碼0,所以我也無法調試。從2.7到3.6的python子進程

這裏是我使用我試圖與POPEN(的參數全部組合)的代碼,

import subprocess as sp 
#import os 
import shutil 
import sys 
import string 


""" 
class Popen(args, bufsize=0, executable=None, 
      stdin=None, stdout=None, stderr=None, 
      preexec_fn=None, close_fds=False, shell=False, 
      cwd=None, env=None, universal_newlines=False, 
      startupinfo=None, creationflags=0): 
""" 
xfoilpath = r'/usr/bin/xfoil' 
ps = sp.Popen(xfoilpath, 
       stdin=sp.PIPE, 
       stdout=sp.PIPE, 
       stderr=None, 
       universal_newlines=True, shell=True) 

def cmd(cmd): 
    ps.stdin.write(cmd+'\n') 
    #ps.stdin.write(bytes(cmd+'\n', 'utf-8')) 
''' 
out, err = ps.communicate(input="naca 4512") 
print (out) 
print (err) 
#print (ps.poll()) 
''' 
cmd("naca 4512") 
cmd("pane") 
cmd("oper") 
cmd("visc 5e005") 
cmd("M 0.2") 
cmd("ITER") 
cmd("200") 
cmd("pacc") 
cmd("4512.log") 
cmd(" ") 
cmd("aseq 0.0 0.0 1.0") 
cmd(" ") # escape OPER 
cmd("quit") # exit 
# resp = ps.stdout.read() 
# print "resp:",resp # console ouput for debug 
ps.stdout.close() 
ps.stdin.close() 
ps.wait() 

,但無法弄清楚,爲什麼它不工作。任何有關如何調試的建議都將非常有幫助。

+0

剛發現它可以與popen.communicate()函數一起使用。 – aram

+0

您可以發佈自己的問題的答案並接受它。也許它會在未來幫助別人。 – bernie

回答

0

剛發現,它可以在python3.6中使用popen.communicate()正常工作。但我不知道它應該通過寫入標準輸入工作。知道什麼是缺失將是有趣的。新代碼的作品如下,

out, err = ps.communicate("naca 4512\n" 
         "pane\n" 
         "oper\n" 
         "visc 5e005\n" 
         "M 0.2\n" 
         "ITER\n" 
         "200\n" 
         "pacc\n" 
         "4512.log\n" 
         " \n" 
         "aseq 0 0 1\n" 
         " \n" 
         "quit\n")