2016-05-27 17 views
1

サブプロセスを介してコマンドを実行すると、印刷せずに終了ステータス1が表示されるか、エラーが発生します。サブプロセスが終了ステータス1を返します

def generate_model(self): 
     if not ((self.username == None) or (self.password == None) or (self.database == None)): 
      cmd = "python -m pwiz -e %s -H %s -u %s -P %s %s > %s"%(self.engine,self.host,self.username,self.password,self.database,self.database+".py") 
      print subprocess.check_call(cmd) 
     else: 
      raise ValueError 

コマンドは、端末が開かれると、入力を求められます。

は、ここに私のコードです。私は、コマンドに直接同じコマンドを実行すると、それはそれは細かい

+1

各文字列を別々にして配列内にコマンドを入れてみましたか? '['python'、 '-m'、 'pwiz']' ... shlex.splitも使用できます。 – Idos

+0

はい、私はそれを試しても、それは 'exit code 1'を返します。 – Harwee

+0

@Idosの助言は、コマンド注入を防ぐために必要なので、本当に良いです。コマンドを文字列として構築しないでください。この問題を解決するには、 'cmd'を印刷してプログラムを実行する必要があります。 '>'リダイレクトを使うと 'check_call()'に 'shell = True'を設定する必要があります。 –

答えて

2

subprocess.check_call()は、デフォルトでシェルを実行していないため、リダイレクト演算子>が動作しません動作します促しexit status 1

を閉じた後。標準出力をリダイレクトするには、代わりにstdoutパラメータを渡す:

with open(filename, 'wb', 0) as file: 
    check_call([sys.executable, '-m', 'pwiz', '-e', ...], stdout=file) 

関連:Python subprocess.check_output(args) fails, while args executed via Windows command line work OKを。