Подтвердить что ты не робот

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

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

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

cmd (оболочка)

затем

cd dir

а также

ls

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

Есть идеи с подпроцессным модулем?

Обновить:

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

4b9b3361

Ответ 1

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

В subprocess.Popen

используйте следующее:
"command1; command2; command3"

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

  • Создайте временный файл ".BAT" и укажите это subprocess.Popen

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

Используйте "" 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])