2

過去にこのモジュールを使用して成功したことがあり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_pathimt

4

1 に答える 1

1

私の推測では、ファイル名を間違って渡しています。たとえば、バックスラッシュを適切にエスケープしていますか? あなたは、このプログラムを呼び出す前にファイルを書き込むと言いましたが、ファイルを実際に物理的にディスク上にフラッシュすることを覚えていますか?

ファイル名をどのように定義しているかを正確に教えていただけますか?

別のオプション: 外部プロセスを呼び出す直前に pdb ブレークポイントを追加します。スクリプトがその時点で停止したら、別のウィンドウを開いて、ファイルがそこにあるかどうかを確認します。

于 2012-12-12T16:29:12.653 に答える