2017-03-27 21 views
0

私はpythonスクリプトでxfoilというコマンドラインを実行しようとしています。私はPython 2.7で最初に書きましたが、後で作業するために3.7で書き直す必要があります。 私がやっていることは、sdtinに書き込むことによって、cliツールxfoilに一連の文字列コマンドを渡すことです。これはpython 2.7でうまく動作しますが、3.6では動作しません。私は両方で終了コード0を取得するので、私はどちらもデバッグすることはできません。ここ2.7から3.6のpythonサブプロセス

は、私が使用していたコードは、

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() 

である私は)(popenので引数のすべての組み合わせを試してみましたが、それが動作していない理由を把握することはできません。デバッグ方法に関する提案は非常に役に立ちます。

+0

は、popen.communicate()funtionで動作することがわかりました。 – 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") 
関連する問題