2016-09-28 8 views
0

Pythonのsubprocess.callを使用して、ディスク上の入力ファイルを読み込んで複数の出力ファイルを作成するCプログラムを呼び出そうとしています。 subprocess.callではありませんが、ターミナルからCプログラムを実行すると期待される結果が得られます。Python:サブプロセスが出力ファイルを書き込まない

最小限の例では、プログラムはスクラッチフォルダ内の入力ファイルを読み込み、同じフォルダに出力ファイルを作成する必要があります。入力ファイル&の場所と名前は、Cプログラムにハードコードされています。

import subprocess 


subprocess.call('bin/program.exe') # parses input file 'scratch/input.txt' 
with open('scratch/output.txt') as f: 
    print(f.read()) 

これが返されます:私は間違って何をやっている

FileNotFoundError: [Errno 2] No such file or directory: 'scratch/output.txt'

subprocess.check_outputを使用すると、エラーは発生しません。

編集: サブプロセスの作業ディレクトリが含まれていることがわかります。 Cの実行ファイルには、exe(すなわち、 '../scratch/input.txt')に対する入力/出力用のハードコーディングされたパスがありますが、subprocess.call()呼び出しには、pythonスクリプトに関連するパスが必要です。これは予期せぬことであり、端末からexeを呼び出すと非常に異なる結果を生み出します。

+0

「インポートコマンド」を使用することをお勧めします。これを使用すると、Cプログラムの出力も得られます(gccで実行する通常の方法で実行できます)。失敗した場合は、ステータスコードが変更されます。例えば、 。 output = commands.getstatusoutput( "gcc test.c") – abhijeetmote

+0

@abhijeetmote 'commands'モジュールは' subprocess'モジュールで廃止されました。 – Valarauko

答えて

1
import os 

subprocess.call('bin/program.exe') # parses input file 'scratch/input.txt' 
if not os.path.isfile('scratch'): 
    os.mkdir('scratch') 
with open(os.path.join('scratch','output.txt'), 'w') as f: 
    f.write('Your message') 

モードでファイルを開く必要があります。例を読む。 os.path.join()でパスに参加する必要があります。

フォルダとファイルが存在しない場合は作成できます。しかし、読書することは何もないでしょう。あなたがそれらに書きたい場合は、上記のように達成することができます。

+0

ファイルモードが指定されていない場合は、デフォルトで読み取ります。また、問題は出力ファイルを読み込むことではなく、出力が作成されないことです。 – Valarauko

+0

存在しないファイルから読み込むことはできません - 書き込み可能なファイルとフォルダを作成するために自分の答えを更新したかどうかにかかわらず、 –

+0

存在しないファイルは読み込めませんが、私の懸念事項は*なぜ*出力ファイルが作成されていないことです。ターミナルからCプログラムを呼び出すと、スクラッチフォルダに期待される出力ファイルが作成されますが、 'subprocess.call'は出力ファイルを作成しません。入力ファイルと出力ファイルの場所と名前は、Cプログラムにハードコードされています。 'subprocess.check_output'は入力ファイルを削除したのとは異なり、エラーも発生しません。この場合、' check_output'にはCプログラムの関連エラーメッセージが含まれています。 – Valarauko

関連する問題