文字列をプログラムに送信してバックグラウンドで実行する python スクリプトを作成しようとしています。コマンド ラインで、次のコードをコピーして貼り付けると、Python プログラムに実行させたいことを正常に実行できます。
printf "f\nil\ncs\n1.e-8 100.0 1.e-8\nn\n0.002\nb\n0.05\nz\n2.e-7\nx4\n5.e-7\n\n\nfort.13\nn\nn\n\n" | vpfit95
ここで:vpfit95
は、PATH 内の実行可能プログラムへのエイリアスです。
私が試したことのいくつかの順列(一度に1つずつ試しました):
import subprocess
vpfitExecutable = 'vpfit95'
String1=r'f\nil\ncs\n1.e-8 100.0 1.e-8\nn\n0.002\nb\n0.05\nz\n2.e-7\nx4\n5.e-7\n\n\nfort.13\nn\nn\n\n'
String2=r"f\nil\ncs\n1.e-8 100.0 1.e-8\nn\n0.002\nb\n0.05\nz\n2.e-7\nx4\n5.e-7\n\n\nfort.13\nn\nn\n\n"
String3="f\nil\ncs\n1.e-8 100.0 1.e-8\nn\n0.002\nb\n0.05\nz\n2.e-7\nx4\n5.e-7\n\n\nfort.13\nn\nn\n\n"
cmd1 = "printf \"" + String1 + "\""
cmd2 = "printf \"" + String1 + "\" | " + vpfitExecutable
cmd3 = "printf \"" + String2 + "\""
cmd4 = "printf \"" + String3 + "\""
print cmd2
p1 = subprocess.Popen([vpfitExecutable, cmd1])
p2 = subprocess.Popen([cmd2])
p3 = subprocess.Popen([vpfitExecutable, cmd3])
p4 = subprocess.Popen([vpfitExecutable, cmd4])
p4 = subprocess.Popen([vpfitExecutable, String1])
p5 = subprocess.Popen([vpfitExecutable, String2])
p6 = subprocess.Popen([vpfitExecutable, String3])
# check
p7 = subprocess.Popen([vpfitExecutable]) # works.
そしてすべて失敗します(p7を除く)。「Fortran ランタイム エラー: ファイルの終わり」(vpfit プログラムによるもの) で失敗するものもあります。その他は、サブプロセス ライブラリへのトレースバックと「OSError: [Errno 2] No such file or directory」で失敗します。
いくつかのチェック:印刷cmd2
してコピーして端末に貼り付けると、完全に機能します。を実行するp7
と、文字列が渡されなくても、期待どおりにプログラムの実行が正しく開始されます。ここでは明らかに基本的なことが欠けていますが、それが何かわかりません。どんな助けでも大歓迎です!