複数のコマンドを連続して実行したい:
すなわち(私の必要性を説明するためだけに):
cmd
(シェル)
それから
cd dir
と
ls
の結果を読み取りますls
。
subprocess
モジュールのアイデアはありますか?
アップデート:
cd dir
とls
はほんの一例です。複雑なコマンドを実行する必要があります (特定の順序に従い、パイプライン処理は一切行いません)。実際、1 つのサブプロセス シェルと、その上で多くのコマンドを起動できる機能が必要です。
複数のコマンドを連続して実行したい:
すなわち(私の必要性を説明するためだけに):
cmd
(シェル)
それから
cd dir
と
ls
の結果を読み取りますls
。
subprocess
モジュールのアイデアはありますか?
アップデート:
cd dir
とls
はほんの一例です。複雑なコマンドを実行する必要があります (特定の順序に従い、パイプライン処理は一切行いません)。実際、1 つのサブプロセス シェルと、その上で多くのコマンドを起動できる機能が必要です。
そのためには、次のことを行う必要があります。
shell=True
を指定し、subprocess.Popen
;
*nix シェル (bash、ash、sh、ksh、csh、tcsh、zsh など) で実行している場合&
cmd.exe
Windows の下で実行している場合一連のコマンドを実行する簡単な方法があります。
で次を使用します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()
これにより、一連のコマンドを作成できます。
名前に「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
更新: 典型的なシェルの場合、シェル自体に実装されており、ディスク上の外部コマンドではないことに注意してください。これは、プロセス内から実行する必要があるプロセスの現在のディレクトリを変更する必要があるためです。コマンドは、シェルによって生成された子プロセスとして実行されるため、これを行うことはできません。