Python でコマンドを順番に実行しますか?
-
21-08-2019 - |
質問
複数のコマンドを続けて実行したいと考えています。
つまり(私の必要性を説明するためだけに):
cmd
(シェル)
それから
cd dir
そして
ls
そしてその結果を読んでください ls
.
あらゆるアイデアを subprocess
モジュール?
アップデート:
cd dir
そして ls
はほんの一例です。複雑なコマンドを (パイプラインを使用せずに、特定の順序に従って) 実行する必要があります。実際、私は 1 つのサブプロセス シェルと、その上で多くのコマンドを起動できる機能が必要です。
解決
一連のコマンドを実行する簡単な方法があります。
で以下を使用します subprocess.Popen
"command1; command2; command3"
または、Windows に行き詰まっている場合は、いくつかの選択肢があります。
一時的な「.BAT」ファイルを作成し、これを
subprocess.Popen
単一の長い文字列内に「 」区切り文字を含む一連のコマンドを作成します。
このように「」を使用します。
"""
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 など) で実行している場合&
の下で実行している場合cmd.exe
Windowsの
名前に「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」は、標準出力、そして最終的にはエラー出力を含む文字列オブジェクトです。
はい サブプロセス.Popen()
関数がサポートする cwd
キーワード引数を使用して、プロセスを実行するディレクトリを設定できます。
実行するだけであれば、最初のステップであるシェルは必要ないと思います。 ls
, 、シェルを介して実行する必要はありません。
もちろん、目的のディレクトリを引数として渡すこともできます。 ls
.
アップデート:典型的なシェルの場合、次のことに注意する価値があるかもしれません。 cd
これはシェル自体に実装されており、ディスク上の外部コマンドではありません。これは、プロセスの現在のディレクトリを変更する必要があり、これはプロセス内から行う必要があるためです。コマンドはシェルによって生成された子処理として実行されるため、これを行うことはできません。
以下の Python スクリプトには、実行したばかりの 3 つの関数があります。
import sys
import subprocess
def cd(self,line):
proc1 = subprocess.Popen(['cd'],stdin=subprocess.PIPE)
proc1.communicate()
def ls(self,line):
proc2 = subprocess.Popen(['ls','-l'],stdin=subprocess.PIPE)
proc2.communicate()
def dir(silf,line):
proc3 = subprocess.Popen(['cd',args],stdin=subprocess.PIPE)
proc3.communicate(sys.argv[1])