繁体   English   中英

在Python中按顺序执行命令?

[英]Execute Commands Sequentially in Python?

我想连续执行多个命令:

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

cmd (外壳)

然后

cd dir

ls

并阅读ls的结果。

有什么想法与subprocess模块?

更新:

cd dirls只是一个例子。 我需要运行复杂的命令(遵循特定的顺序,没有任何流水线操作)。 实际上,我想要一个子进程shell并能够在其上启动许多命令。

要做到这一点,你必须:

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

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

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

这将允许您构建一系列命令。

在名称中包含'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关键字参数,您可以使用该参数设置运行该进程的目录。

我想第一步,shell,不需要,如果您只想运行ls ,则无需通过shell运行它。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM