複数のコマンドを続けて実行したい:
つまり(私の必要性を説明するためだけに):
cmd
(シェル)
その後
cd dir
そして
ls
ls
の結果を読みます。
subprocess
モジュールに関するアイデアはありますか?
更新:
cd dir
とls
は単なる例です。複雑なコマンドを実行する必要があります(パイプラインを使用せずに、特定の順序に従います)。実際、1つのサブプロセスシェルと、その上で多くのコマンドを起動できる機能が必要です。
一連のコマンドを実行する簡単な方法があります。
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()
これにより、一連のコマンドを作成できます。
これを行うには、次のことを行う必要があります。
Shell=True
呼び出しでsubprocess.Popen
引数を指定し、;
* nixシェル(bash、ash、sh、ksh、csh、tcsh、zshなど)で実行している場合&
Windowsのcmd.exe
で実行している場合名前に「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」は、標準出力と、最終的にはエラー出力を含む文字列オブジェクトです。
はい、subprocess.Popen()
関数はcwd
キーワード引数をサポートしており、プロセスを実行するディレクトリを設定できます。
最初のステップであるシェルは必要ないと思います。必要なのがls
を実行することだけであれば、シェルを介して実行する必要はありません。
もちろん、目的のディレクトリを引数としてls
に渡すこともできます。
更新:一般的なシェルの場合、cd
はシェル自体に実装されており、ディスク上の外部コマンドではないことに注意してください。これは、プロセスの現在のディレクトリを変更する必要があるためです。これは、プロセス内から実行する必要があります。コマンドは子処理として実行され、シェルによって生成されるため、これを行うことはできません。