4

私はこれをまったく正しく理解していないかもしれませんが、PythonプログラムがLinuxシェル上にあるかのようにコマンドを実行するサブプロセスとインターフェイスできるようにしようとしています。

たとえば、プログラムの後半で「cd /」を実行してから「pwd」を実行し、「/」を取得できるようにします。

現在、subprocess.Popenとcommunicate()メソッドを使用してデータを送受信しようとしています。Popenコンストラクターで送信される最初のコマンドは正常に実行され、適切な出力を提供します。しかし、communicate(input = "pwd")を介して別のコマンドを送信することはできません。

これまでの私のコード:

from subprocess i
term=Popen("pwd", stdout=PIPE, stdin=PIPE)
print(flush(term.communicate()))
term.communicate(input="cd /")
print(flush(term.communicate(input="pwd")))

これを行うためのより良い方法はありますか?ありがとう。

また、Python3を実行しています。

4

1 に答える 1

0

まず、シェル コマンドの実行とプログラムの実行は同じではないことを理解する必要があります。

例を挙げましょう:

>>> import subprocess
>>> subprocess.call(['/bin/echo', '$HOME'])
$HOME
0
>>> subprocess.call(['/bin/echo $HOME'], shell=True)
/home/kkinder
0

shell=True パラメーター$HOMEがないと、テキストは展開されないことに注意してください。これは、/bin/echoプログラムが解析しないため$HOMEです。Bash は解析します。2 番目の呼び出しで実際に起こっていることは、次のようなものです。

>>> subprocess.call(['/bin/bash', '-c', '/bin/echo $HOME'])
/home/kkinder
0

このshell=Trueパラメーターを使用すると、基本的に subprocess モジュールに、シェルを使用してこのテキストを解釈します

したがって、 を追加できますがshell=True、問題は、コマンドが終了すると、その状態が失われることです。スタック内の各アプリケーションには、独自の作業ディレクトリがあります。したがって、ディレクトリは次のようになります。

  • バッシュ - /foo/bar
    • パイソン - /foo
      • サブプロセス経由のbash - /

コマンドの実行後、python プロセスのパスは同じままで、シェルがコマンドを終了するとサブプロセスのパスは破棄されます。

基本的に、あなたが求めているものは実用的ではありません。必要なことは、Bash へのパイプを開き、ユーザーが入力したコマンドをインタラクティブにフィードしてから、ブロックしない方法で出力を読み取ることです。これには、複雑なパイプ、スレッドなどが含まれます。もっと良い方法はありませんか?

于 2013-01-03T21:59:41.667 に答える