24

複数のコマンドを連続して実行したい:

すなわち(私の必要性を説明するためだけに):

cmd(シェル)

それから

cd dir

ls

の結果を読み取りますls

subprocessモジュールのアイデアはありますか?

アップデート:

cd dirlsはほんの一例です。複雑なコマンドを実行する必要があります (特定の順序に従い、パイプライン処理は一切行いません)。実際、1 つのサブプロセス シェルと、その上で多くのコマンドを起動できる機能が必要です。

4

5 に答える 5

29

そのためには、次のことを行う必要があります。

  • 呼び出しで引数shell=Trueを指定し、subprocess.Popen
  • コマンドを次のように区切ります。
    • ;*nix シェル (bash、ash、sh、ksh、csh、tcsh、zsh など) で実行している場合
    • &cmd.exeWindows の下で実行している場合
于 2008-12-11T15:35:32.687 に答える
23

一連のコマンドを実行する簡単な方法があります。

で次を使用しますsubprocess.Popen

"command1; command2; command3"

または、Windows で行き詰まっている場合は、いくつかの選択肢があります。

  • 一時的な「.BAT」ファイルを作成し、これをsubprocess.Popen

  • 1 つの長い文字列に "\n" セパレータを使用して一連のコマンドを作成します。

このように """ を使用します。

"""
command1
command2
command3
"""

または、断片的に行う必要がある場合は、このようなことを行う必要があります。

class Command( object ):
    def __init__( self, text ):
        self.text = text
    def execute( self ):
        self.proc= subprocess.Popen( ... self.text ... )
        self.proc.wait()

class CommandSequence( Command ):
    def __init__( self, *steps ):
        self.steps = steps
    def execute( self ):
        for s in self.steps:
            s.execute()

これにより、一連のコマンドを作成できます。

于 2008-12-11T14:23:17.213 に答える
5

名前に「foo」が含まれるすべてのファイルで「bar」を見つける:

from subprocess import Popen, PIPE
find_process = Popen(['find', '-iname', '*foo*'], stdout=PIPE)
grep_process = Popen(['xargs', 'grep', 'bar'], stdin=find_process.stdout, stdout=PIPE)
out, err = grep_process.communicate()

'out' と 'err' は、標準出力と、最終的にはエラー出力を含む文字列オブジェクトです。

于 2008-12-11T13:59:46.997 に答える
2

はい、このsubprocess.Popen()関数はcwd、プロセスを実行するディレクトリを設定できるキーワード引数をサポートしています。

最初のステップであるシェルは必要ないと思います。実行するだけであればls、シェルを介して実行する必要はありません。

もちろん、目的のディレクトリを引数として に渡すこともできますls

cd更新: 典型的なシェルの場合、シェル自体に実装されており、ディスク上の外部コマンドではないことに注意してください。これは、プロセス内から実行する必要があるプロセスの現在のディレクトリを変更する必要があるためです。コマンドは、シェルによって生成された子プロセスとして実行されるため、これを行うことはできません。

于 2008-12-11T13:35:39.243 に答える