我想要连续执行多个命令:
即(只是为了说明我的需要):
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等)下运行, 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])