2016-03-19 8 views
0

他の同様の質問を見ましたが、私の質問に対する答えを見つけることができませんでした。"<"を使用してサブプロセス内のファイルをリダイレクトするにはどうすればよいですか?

これは私が実行したいものです。

gagner -arg1 < file1 

これは、これまでの私のコードです:私はこのコードを実行する場合

filePath = tkinter.filedialog.askopenfilename(filetypes=[("All files", "*.*")]) 

fileNameStringForm = (basename(filePath)) 
fileNameByteForm = fileNameStringForm.encode(encoding='utf-8') 

process = subprocess.Popen(['gagner','-arg1'], shell = True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

stdout, stderr = process .communicate(fileNameByteForm) 

stringOutput = stdout.decode('utf-8') 
print(stringOutput) 

は現在、何も起こりません。エラーは表示されませんが、出力も出力されません。

は、誰かが私のpythonを使用して、上記のLinuxコマンドを実行することができる方法を見せてもらえます。

+0

ところで、タイプミスノート:あなたはほぼ確実 'stringOutput = stdout.decode( 'UTF-8')' 'ないURF-8'を望んでいました。 – ShadowRanger

+0

それを指摘するための@ShadowRanger TY。 –

答えて

0

あなたは、プロセス(それはデータにstdinからをファイルを読むために期待し、ないファイル)に名を渡すべきではありません。代わりに、ファイルハンドル自体を渡します(または生のファイルデータであるPIPEを使用します)。

だから、あなただけ行うことができます:

with open(fileNameStringForm, 'rb') as f: 
    process = subprocess.Popen(['gagner','-arg1'], stdin=f, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    stdout, stderr = process.communicate() 

またはやや少ない効率的に(Pythonのではなく、直接リード処理をさせるのは、それを書き、それを読む必要があるため):

process = subprocess.Popen(['gagner','-arg1'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
with open(fileNameStringForm, 'rb') as f: 
    stdout, stderr = process.communicate(f.read()) 

注意両方の呼び出しからshell=Trueを削除しました。 listコマンドフォームを使用すると、必要がなくなり、シェルのラッピングを避けるために、より高速で安全で安定します。

+0

"open(fileNameStringForm、 'rb')をf:" do "として説明してください。私はかなりPythonに新しい、申し訳ありませんが、これは明らかです。 –

+0

変数fileNameByteFormが必要ないことを確認したいだけですか?また、あなたの第二の方法を使用し、それは私に指示「FileNotFoundErrorは:[ERRNO 2]そのようなファイルまたはディレクトリ: 『gagner』 」 –

+0

は、私はあなたの第二の方法を使用していないし、それは 'FileNotFoundError私に語った:[errnoを2]いいえそのようなファイルやディレクトリを: 'ガグナー'。 J.Doe @ –

関連する問題