在 Python 中按顺序执行命令?
Posted
技术标签:
【中文标题】在 Python 中按顺序执行命令?【英文标题】:Execute Commands Sequentially in Python? 【发布时间】:2010-09-26 10:31:18 【问题描述】:我想连续执行多个命令:
即(只是为了说明我的需要):
cmd
(外壳)
然后
cd dir
和
ls
并读取ls
的结果。
知道subprocess
模块吗?
更新:
cd dir
和ls
只是一个例子。我需要运行复杂的命令(按照特定的顺序,没有任何流水线)。事实上,我想要一个子进程 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 中按顺序执行命令?的主要内容,如果未能解决你的问题,请参考以下文章