web-dev-qa-db-ja.com

Pythonでコマンドを順番に実行しますか?

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

つまり(私の必要性を説明するためだけに):

cmd(シェル)

その後

cd dir

そして

ls

lsの結果を読みます。

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

更新:

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

21
MechanTOurS

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

subprocess.Popenで以下を使用します

"command1; command2; command3"

または、Windowsで立ち往生している場合は、いくつかの選択肢があります。

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

  • 単一の長い文字列に「\ 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()

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

20
S.Lott

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

  • Shell=True呼び出しでsubprocess.Popen引数を指定し、
  • コマンドは次のように区切ります:
    • ; * nixシェル(bash、ash、sh、ksh、csh、tcsh、zshなど)で実行している場合
    • &Windowsのcmd.exeで実行している場合
26
tzot

名前に「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」は、標準出力と、最終的にはエラー出力を含む文字列オブジェクトです。

3
Oli

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

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

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

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

2
unwind