2008-12-11 1 views
16

Я хотел бы выполнить несколько команд подряд:выполнять команды последовательно в Python

т.е. (только для иллюстрации моей потребности):

CMD (оболочка)

затем

кд реж

и

Ls

и прочитать результат квазимолекулы.

Любая идея с модулем подпроцесса?

UPDATE:

кд реж и Ls являются всего лишь пример. Мне нужно запускать сложные команды (следуя определенному порядку, без конвейерной обработки). На самом деле, я бы хотел, чтобы одна оболочка подпроцесса и возможность запускать на нем множество команд.

+3

может быть, вы должны написать скрипт вместо питон скрипт – hop 2008-12-11 14:10:18

ответ

19

Существует простой способ выполнения последовательности команд.

Используйте следующий subprocess.Popen

"command1; command2; command3" 

Или, если вы застряли с окнами, у вас есть несколько вариантов.

  • Создать временный файл «.BAT», и обеспечить это subprocess.Popen

  • Создание последовательности команд с „\ п“ сепараторов в одной длинной строки.

Использование "" "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

`subprocess.Popen («LS»)` работает. Однако `subprocess.Popen (" ls; ls ")` терпит неудачу для меня. Ошибка: `Traceback (самый последний вызов последнего): Файл "", строка 1, в Файл "/usr/lib64/python2.6/subprocess.py", строки 639, в __init__ errread, errwrite) Файл «/usr/lib64/python2.6/subprocess.py», строка 1228, в _execute_child raise child_exception OSError: [Errno 2] Нет такого файла или каталога` – 2012-09-18 15:51:12

+0

Это не удалось, потому что Popen ожидает список в качестве первого аргумента и просто «ls» эквивалентен [«ls»]. Он пытается найти исполняемый файл с именем «ls; ls», которого явно нет. – 2014-12-09 08:19:50

+0

Не может ли выполнить из класса CommandSequence выполнение execute() из класса Command? Если да, то как работает s.execute? – user97662 2015-03-26 00:48:29

2

Да, функция subprocess.Popen() поддерживает аргумент в cwd ключевое слово, с помощью которого вы можете установить каталог он запускает процесс в.

Я думаю, первый шаг, оболочка, не нужен, если все, что вы хотите, для запуска ls, нет необходимости запускать его через оболочку.

Конечно, вы также можете просто передать желаемый каталог в качестве аргумента в ls.

Обновление: возможно, стоит отметить, что для обычных оболочек cd реализован в самой оболочке, это не внешняя команда на диске. Это связано с тем, что ему необходимо изменить текущий каталог процесса, который должен выполняться внутри процесса. Поскольку команды выполняются как обработанные дочерними элементами, порожденные оболочкой, они не могут этого сделать.

1

Finding «бар» в каждом файле, имя которого содержит «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() 

«из» и «ERR» строковые объекты, содержащие стандартный вывод и, в конечном счете, выход ошибки.

21

Для этого вам необходимо:

  • поставить shell=True аргумент в subprocess.Popen вызова, а также
  • отдельные команды с:
    • ;, если работает под * NIX оболочки (баш, золы, ш, КШ, CSH, Tcsh, ЗШ и т.д.)
    • & при работе под cmd.exe окон
-1

ниже питона сценария есть 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]) 

 Смежные вопросы

  • Нет связанных вопросов^_^