Python コードと同時に実行される外部プログラムの出力をブロックしない方法で読み取りたい。プログラム (たとえば netcat) を起動するには、subprocess.Popen を使用し、その stdout と stderr を subprocess.PIPE にバインドします。次に、そのプログラムがまだ実行されているかどうかを確認するという使命を持つ multiprocessing.Process を起動します ( proc.poll() )。実行されている場合は、パイプから読み取ろうとします。私の問題は、「proc.poll()」が「listen_to_fds」関数で常に 0 を返すことですが、「call」関数 (メイン関数) では完全にうまく機能することです。つまり、proc.poll() は None を返します (アプリケーション私は打ち上げが決して終わらないので、それが正しい戻り値です)。
次の関数を次のように呼び出します: call ("./test.sh")
私のモジュール
def listen_to_fds(logger,proc):
while proc.poll() is None:
print("program still running", proc.returncode)
data = proc.stdout.read()
if data:
print("Data", data)
time.sleep(1)
print("last check", proc.returncode )
def call(cli ):
logger = logging.getLogger("isix.daemon")
cli_args = shlex.split(cli)
proc = subprocess.Popen(
cli_args
,stdout=subprocess.PIPE
,stderr=subprocess.PIPE
)
set_fd_as_nonblocking( proc.stdout )
set_fd_as_nonblocking( proc.stderr )
pipe2 = multiprocessing.Process(
target=listen_to_fds,
args=( logger, proc )
)
while proc.poll() is None:
print("program still running", proc.returncode)
data = proc.stdout.read()
if data:
print("Data", data)
time.sleep(1)