在Python中按顺序执行命令

我想要连续执行多个命令:

即(只是为了说明我的需要):

cmd (shell)

然后

CD迪尔

LS

并读取ls的结果。

任何想法与subprocess模块?

更新:

cd dir和ls只是一个例子。 我需要运行复杂的命令(按照特定的顺序,没有任何stream水线)。 事实上,我想要一个subprocessshell,并能够启动许多命令。

有一个简单的方法来执行一系列命令。

subprocess.Popen使用以下内容

 "command1; command2; command3" 

或者,如果你被困在窗户,你有几个选择。

  • 创建一个临时的“.BAT”文件,并将其提供给subprocess.Popen

  • 使用“\ n”分隔符在一个长字符串中创建一系列命令。

像这样使用“”“s。

 """ 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() 

这将允许你建立一系列的命令。

要做到这一点,你将不得不:

  • subprocess.Popen调用中提供shell=True参数
  • 用以下命令分隔命令:
    • ; 如果在* nix shell(bash,ash,sh,ksh,csh,tcsh,zsh等)下运行,
    • 如果在Windows的cmd.exe下运行

是的, subprocess.Popen ()函数支持一个cwd关键字参数,您可以使用它设置运行进程的目录。

我猜,第一步,shell是不需要的,如果你只想运行ls ,就不需要通过shell来运行。

当然,你也可以将所需的目录作为参数传递给ls

更新:值得注意的是,对于典型的shell, cd是在shell本身实现的,它不是磁盘上的外部命令。 这是因为它需要改变进程的当前目录,这个目录必须在进程内完成。 由于命令作为子进程处理的子进程运行,因此它们不能执行此操作。

在每个包含“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”是包含标准输出和最终错误输出的字符串对象。

下面的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])