過去にこのモジュールを使用して成功したことがありsubprocess
ますが、Fortran 実行可能ファイルに引数を渡すのに苦労しました。
コマンドラインで動作し.\IMT.EXE path\to\file
ます。問題ありません。しかし、サブプロセス モジュールを使用してまったく同じ引数を渡そうとすると、
subprocess.call(['.\IMT.EXE', file_path])
IMT は、入力されたファイルが無効であることを通知します。残念ながら、IMT は無効なファイル名を出力しないため、デバッグが困難になります。ファイルがそこにあることは知っていますし、IMT に引数が渡されていることもわかっていますが、何らかの理由で文字列が正しく渡されていません。gcc
少なくとも無効なファイル名を印刷しようとすることができるように、現在cygwinでダウンロードしています(以前にfortranを書いたことはありませんが)。
私が成功せずに試した他のこと:これはただハングして何もしません。
p = subprocess.Popen(['.\IMT.EXE'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
result = p.communicate(file_path.encode())
または、これは単に印刷されOutput:
、何も表示されません。
p.stdin.write(temp_i_name.encode())
p.kill()
print('Output: ', p.stdout.read().decode())
私はそれが役立つとは信じていませんでしたが(そしてそうではありませんでした)、設定も試しましshell=True
た。
私も試してみましたos.system
os.system('.\IMT.EXE' + ' ' + file_path)
同じエラー:
Input Error.
Command line argument for Inverse Modeling Toolkit must
be valid path and filename of instruction file.
その他の関連情報:
- ウィンドウズ7
- パイソン3.3
- IMT は Fortran90 で書かれました
- IMT のソース コードはありますが、Fortran については何も知りません。
モジュールに関するSOの他の投稿を見てきましたsubprocess
が、どれも役に立ちませんでした。
編集:
だから私はついにそれを機能させました。問題はバックスラッシュの不適切な処理ではありませんでしたが、サブプロセスIMT.EXE
が開かれたときに、そのディレクトリが現在の作業ディレクトリと見なされると想定していました。そうではありません。IMT: を呼び出していて、 directory に存在するため、ファイルの名前としてsubprocess.call([os.path.join('imt', 'IMT.EXE'), file_path])
渡すだけだったので、もっと明確にする必要がありました。混乱させて申し訳ありません。file_path
imt