Выполнение команд последовательно в Python
Я хотел бы выполнить несколько команд подряд:
т.е. (просто чтобы проиллюстрировать мою потребность):
cmd
(оболочка)
затем
cd dir
а также
ls
и прочитайте результат ls
.
Есть идеи с подпроцессным модулем?
Обновить:
cd dir
и ls
- только пример. Мне нужно выполнить сложные команды (в определенном порядке, без какой-либо конвейерной работы). На самом деле, мне нужна одна оболочка подпроцесса и возможность запускать на ней много команд.
Ответы
Ответ 1
Существует простой способ выполнить последовательность команд.
В subprocess.Popen
используйте следующее:
"command1; command2; command3"
Или, если вы застряли в окнах, у вас есть несколько вариантов.
Используйте "" s, как это.
"""
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
Для этого вам нужно будет:
- укажите аргумент
shell=True
в вызове subprocess.Popen
и
- отделить команды с помощью:
-
;
, если выполняется под оболочкой * nix (bash, ash, sh, ksh, csh, tcsh, zsh и т.д.)
-
&
, если выполняется под cmd.exe
Windows
Ответ 3
Поиск "бара" в каждом файле, чье имя содержит "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' и 'err' - это строковые объекты, содержащие стандартный вывод и, в конечном итоге, вывод ошибки.
Ответ 4
Да, функция subprocess.Popen()
поддерживает аргумент ключевого слова cwd
, с помощью которого вы можете установить каталог, в котором он запускает процесс.
Я предполагаю, что первый шаг, оболочка, не нужен, если все, что вам нужно, - это запустить ls
, нет необходимости запускать его через оболочку.
Конечно, вы также можете просто передать желаемый каталог в качестве аргумента ls
.
Обновление: может быть, стоит отметить, что для типичных оболочек cd
реализован в самой оболочке, это не внешняя команда на диске. Это связано с тем, что ему необходимо изменить текущий каталог процесса, который должен выполняться внутри процесса. Поскольку команды выполняются как обработанные дочерними элементами, порожденные оболочкой, они не могут этого сделать.
Ответ 5
ниже python script имеют 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])