7

Python を使用して、Fortran 実行可能ファイルの呼び出しとユーザー入力の送信を含むプロセスを自動化しようとしています。同様の質問を読んだり、さまざまなことを試したりするのに数時間を費やしましたが、うまくいきませんでした。これは、私が最後に試したことを示すための最小限の例です

#!/usr/bin/python

import subprocess

# Calling executable 
ps = subprocess.Popen('fortranExecutable',shell=True,stdin=subprocess.PIPE)
ps.communicate('argument 1')
ps.communicate('argument 2')

ただし、これを実行しようとすると、次のエラーが発生します。

  File "gridGen.py", line 216, in <module>
    ps.communicate(outputName)
  File "/opt/apps/python/epd/7.2.2/lib/python2.7/subprocess.py", line 737, in communicate
    self.stdin.write(input)
ValueError: I/O operation on closed file

提案や指針は大歓迎です。

編集:

Fortran 実行可能ファイルを呼び出すと、次のようにユーザー入力を求められます。

fortranExecutable
Enter name of input file: 'this is where I want to put argument 1'
Enter name of output file: 'this is where I want to put argument 2'

どういうわけか、実行可能ファイルを実行し、ユーザー入力を求めるまで待ってから、その入力を提供する必要があります。

4

4 に答える 4

8

入力が以前の回答に依存しない場合は、次を使用して一度にすべてを渡すことができます.communicate()

import os
from subprocess import Popen, PIPE

p = Popen('fortranExecutable', stdin=PIPE) #NOTE: no shell=True here
p.communicate(os.linesep.join(["input 1", "input 2"]))

.communicate()プロセスが終了するのを待つため、最大で 1 回呼び出すことができます。

于 2014-03-08T08:05:20.430 に答える
1

仕様 にあるようcommunicate()に、サブプロセスが終了するのを待つため、2 番目の呼び出しは終了したプロセスに向けられます。

プロセスとやり取りしたい場合は、p.stdin代わりに &Co を使用してください (デッドロックの警告に注意してください)。

于 2014-02-03T08:06:31.533 に答える