3

Popenの同じ「セッション」で複数の呼び出しを行う方法はありますか?たとえば、コマンドを1つの長い文字列に連結しなくても、それを介して呼び出しを行い、その後に別の呼び出しを行うことはできますか?

4

3 に答える 3

3

popen を使用する場合、「呼び出しを行う」のではなく、実行可能ファイルを実行し、stdin、stdout、および stderr を介してそれと対話しています。実行可能ファイルに作業の「セッション」を実行する何らかの方法がある場合 (たとえば、標準入力から行を読み取ることによって)、はい、それを行うことができます。それ以外の場合は、複数回実行する必要があります。

subprocess.Popen は (ほとんどの場合) execvp(3) の単なるラッパーです

于 2009-02-26T05:59:09.707 に答える
1

シェルを実行して複数のコマンドを送信できるようにしたい (そしてそれらの出力を読み取れるようにしたい) と仮定すると、次のようなことができるようです。

from subprocess import *
p = Popen(['/bin/sh'], shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE)

その後、例えば:

>>> p.stdin.write("cat /etc/motd\n")
>>> p.stdout.readline()
'Welcome to dev-linux.mongo.com.\n'

(もちろん、あなたもチェックするかstderr、またはとのPopenマージを依頼する必要がありますstdout)。上記の大きな問題stdinの 1 つは、パイプとstdoutパイプがブロック モードになっているため、シェルからの出力を永久に待機して「スタック」しやすいことです。私はまだ試していませんが、ActiveState のサイトに、これに対処する方法を示すレシピがあります。

更新select:関連する質問/回答を見た後、Pythonの組み込みモジュールを使用して、読み取るデータがあるかどうかを確認する方が簡単なようです(もちろん、stdoutについても同じことを行う必要があります)。stderr

>>> select.select([p.stdout], [], [], 0)
([<open file '<fdopen>', mode 'rb' at 0x10341690>], [], [])
于 2009-02-26T06:09:06.517 に答える
0

たとえば、コマンドを 1 つの長い文字列に連結することなく、それを介して呼び出しを行い、その後に別の呼び出しを行うことはできますか?

shell=True を使用しているようです。必要がない限り、しないでください。代わりに shell=False (デフォルト) を使用し、コマンド/引数リストを渡します。

Popen の同じ「セッション」で複数の呼び出しを行う方法はありますか? たとえば、コマンドを 1 つの長い文字列に連結することなく、それを介して呼び出しを行い、その後に別の呼び出しを行うことはできますか?

2 つの Popen インスタンスを作成し、必要に応じてそれぞれを待機/通信できない理由はありますか? 私があなたを正しく理解していれば、それはそれを行う通常の方法です。

于 2009-02-26T04:24:14.240 に答える