Выполнять команды последовательно в Python?

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

т.е. (просто чтобы проиллюстрировать мою потребность):

cmd (оболочка)

тогда

cd dir

а также

ls

и прочитайте результат ls.

Любая идея с subprocessмодулем?

Обновить:

cd dirи lsпросто пример. Мне нужно выполнить сложные команды (в определенном порядке, без какой-либо конвейерной работы). На самом деле, мне нужна одна оболочка подпроцесса и возможность запускать на ней много команд.

11.12.2008 13:30:23
Может быть, вы должны написать сценарий оболочки вместо сценария Python
user3850 11.12.2008 14:10:18
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

"command1; command2; command3"

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

  • Создайте временный файл ".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()

Это позволит вам построить последовательность команд.

20
11.12.2008 20:24:36
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
Xander Dunn 18.09.2012 15:51:12
Это не удалось, потому что Popen ожидает список в качестве первого аргумента и просто "ls" эквивалентно ["ls"]. Он пытается найти исполняемый файл с именем "ls; ls", которого, очевидно, там нет.
Jatin Kumar 9.12.2014 08:19:50
Не будет ли выполнение из класса CommandSequence перескочить на execute () из класса Command? Если так, то как работает s.execute?
user97662 26.03.2015 00:48:29
отсутствие оболочки = True вызвало для меня ту же проблему. def do_shell (self, command): self.proc = subprocess.Popen (command, shell = True) self.proc.wait ()
Neil McGill 13.05.2015 21:54:13
Код даже не тестировался
MaxBlax360 16.05.2017 08:02:34

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

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

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

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

2
11.12.2008 13:35:39

Поиск 'bar' в каждом файле, имя которого содержит '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' являются строковыми объектами, содержащими стандартный вывод и, в конечном итоге, вывод ошибок.

3
11.12.2008 13:59:46

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

  • предоставить shell=Trueаргумент в subprocess.Popenвызове, и
  • разделите команды:
    • ; если работает под оболочкой * nix (bash, ash, sh, ksh, csh, tcsh, zsh и т. д.)
    • &если работает под cmd.exeWindows
26
11.12.2008 15:35:32
Или для Windows, можете использовать &&, чтобы команда, в которой произошла ошибка, помешала выполнению команд после нее.
twasbrillig 26.01.2014 20:45:22
@twasbrillig Интересно; Я не знал, что cmd.exe разделяет этот разделитель команд с оболочками Unix. Я должен обновить свои знания. Спасибо!
tzot 27.01.2014 07:47:47
Спасибо, это бесценно, и его было действительно трудно найти.
CodeMonkey 11.07.2017 12:41:24

ниже 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])
-1
3.10.2015 14:18:30
это неверно. cdне влияет на родительский элемент, и вполне вероятно, что OP хочет встроить в команду оболочки ( Popen()не запускает оболочку, пока вы не попросите явно - хотя это не поможет в этом случае).
jfs 4.10.2015 08:58:05