可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I would like to execute multiple commands in a row:
ie (just to illustrate my need):
cmd (the shell)
then
cd dir
and
ls
and read the result of the ls.
Any idea with subprocess module ?
UPDATE:
cd dir and ls are just an example. I need to run complex commands (following a particular order, without any pipelining). In fact, i would like one subprocess shell and the ability to launch many commands on it.
回答1:
There is an easy way to execute a sequence of commands.
Use the following in subprocess.Popen
"command1; command2; command3"
Or, if you're stuck with windows, you have several choices.
Create a temporary ".BAT" file, and provide this to subprocess.Popen
Create a sequence of commands with "\n" separators in a single long string.
Use """s, like this.
"""
command1
command2
command3
"""
Or, if you must do things piecemeal, you have to do something like this.
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()
That will allow you to build a sequence of commands.
回答2:
To do that, you would have to:
- supply the
shell=True
argument in the subprocess.Popen
call, and
- separate the commands with:
;
if running under a *nix shell (bash, ash, sh, ksh, csh, tcsh, zsh etc)
&
if running under the cmd.exe
of Windows
回答3:
Yes, the subprocess.Popen()
function supports a cwd
keyword argument, with which you can set the directory it runs the process in.
I guess the first step, the shell, is not needed, if all you want is to run ls
, there's no need to run it through a shell.
Of course, you could also just pass the desired directory as an argument to ls
.
Update: it might be worth noting that for typical shells, cd
is implemented in the shell itself, it is not an external command on disk. This is because it needs to change the process' current directory, which must be done from within the process. Since commands run as child processed, spawned by the shell, they cannot do this.
回答4:
Finding 'bar' in every file whose name contains 'foo':
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' and 'err' are string objects containing the standard output and, eventually, the error output.
回答5:
below python script have 3 function what you went just excute:
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])