在 Python 中按顺序执行命令?

Posted

技术标签:

【中文标题】在 Python 中按顺序执行命令?【英文标题】:Execute Commands Sequentially in Python? 【发布时间】:2010-09-26 10:31:18 【问题描述】:

我想连续执行多个命令:

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

cmd(外壳)

然后

cd dir

ls

并读取ls的结果。

知道subprocess 模块吗?

更新:

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

【问题讨论】:

也许你应该写一个shell脚本而不是python脚本 【参考方案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])

【讨论】:

不正确。 cd 对父级没有影响,并且 OP 很可能希望内置到 shell 命令中(Popen() 不会运行 shell,除非你明确要求 - 尽管在这种情况下它不会有帮助)。跨度> 【参考方案2】:

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

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

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

【讨论】:

subprocess.Popen("ls") 有效。但是,subprocess.Popen("ls; ls") 对我来说失败了。错误:Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__ errread, errwrite) File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory 这失败了,因为 Popen 需要一个列表作为它的第一个参数,并且只是 "ls" 等价于 ["ls"]。它试图找到一个名为“ls; ls”的可执行文件,但显然不存在。 CommandSequence 类的执行不会覆盖 Command 类的 execute() 吗?如果是这样,那么 s.execute 是如何工作的? 代码甚至没有经过测试 使用s = """my script with line break""" 并使用subprocess.run([s], shell=True) 运行它对我来说效果很好。【参考方案3】:

为此,您必须:

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

【讨论】:

或者对于windows,可以使用&&,这样出错的命令将阻止执行它之后的命令。 @twasbrillig 有趣;我不知道 cmd.exe 与 Unix shell 共享这个命令分隔符。我应该更新我的知识。谢谢! 谢谢,这是无价之宝,真的很难找到。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

我想第一步,shell,是不需要的,如果你只想运行ls,就没有必要通过shell运行它。

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

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

【讨论】:

以上是关于在 Python 中按顺序执行命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何按顺序执行命令/功能

linux中批处理文件顺序执行命令的输入

批处理文件命令,怎样按顺序执行命令?

Linux 命令执行顺序控制与管道

每日一linux命令2命令执行顺序:

多命令顺序执行,dd命令,管道|,grep,通配符