我想连续执行多个命令:
ie(只是为了说明我的需要):
cmd (shell)
然后
cd dir
和
LS
并阅读ls。
的结果对子进程模块有什么想法吗?
更新:
cd dir和ls只是一个例子。我需要运行复杂的命令(遵循特定的顺序,没有任何流水线操作)。实际上,我想要一个子进程shell,并能够在其上启动许多命令。
答案 0 :(得分:24)
要做到这一点,你必须:
shell=True
来电中提供subprocess.Popen
参数,;
如果在* nix shell下运行(bash,ash,sh,ksh,csh,tcsh,zsh等)&
Windows cmd.exe
答案 1 :(得分:20)
有一种简单的方法可以执行一系列命令。
在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()
这将允许您构建一系列命令。
答案 2 :(得分:3)
在名称中包含'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'是包含标准输出的字符串对象,最终是错误输出。
答案 3 :(得分:2)
是的,subprocess.Popen()
函数支持cwd
关键字参数,您可以使用该参数设置运行该过程的目录。
我想第一步,shell,不需要,如果您只想运行ls
,则无需通过shell运行它。
当然,您也可以将所需目录作为参数传递给ls
。
更新:值得注意的是,对于典型的shell,cd
是在shell本身实现的,它不是磁盘上的外部命令。这是因为它需要更改进程的当前目录,该目录必须在进程内完成。由于命令作为子处理运行,由shell生成,因此无法执行此操作。
答案 4 :(得分:-1)
下面的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])