Использование «apt-get install xxx» внутри скрипта Python - PullRequest
7 голосов
/ 13 декабря 2011

В настоящее время мне нужно установить пакет, используя apt или rpm, в зависимости от ОС.Я видел библиотеку «apt» для обновления или обновления системы, но возможно ли использовать ее для установки одного пакета?

Я пытался использовать слишком «подпроцесс»:

subprocess.Popen('apt-get install -y filetoinstall', shell=True, stdin=None, stdout=None, stderr=None, executable="/bin/bash")

Но эта команда показывает весь процесс в оболочке, я не могу его скрыть.

Спасибо за вашу помощь.

Ответы [ 4 ]

10 голосов
/ 13 декабря 2011

Вы можете использовать check_call из библиотеки subprocess.

from subprocess import STDOUT, check_call
import os
check_call(['apt-get', 'install', '-y', 'filetoinstall'],
     stdout=open(os.devnull,'wb'), stderr=STDOUT) 

Дамп stdout в /dev/null или os.devnull в этом случае.

os.devnull не зависит от платформы и вернет /dev/null в POSIX и nul в Windows (что не имеет значения, поскольку вы используете apt-get, но все же полезно знать :))

3 голосов
/ 13 декабря 2011

Спасибо, ребята! Я использую часть каждого решения. Мой код:

proc = subprocess.Popen('apt-get install -y FILE', shell=True, stdin=None, stdout=open(os.devnull,"wb"), stderr=STDOUT, executable="/bin/bash")
proc.wait()

Добавлено: стандартный вывод и .wait

Еще раз спасибо из Аргентины!

3 голосов
/ 13 декабря 2011

Для этой конкретной задачи в качестве альтернативы subprocess вы можете рассмотреть возможность использования Fabric , инструмента развертывания python для автоматизации сборок.

0 голосов
/ 13 декабря 2011

Используйте это, чтобы перенаправить вывод в / dev / null:

proc = subprocess.Popen('apt-get install -y filetoinstall', shell=True, stdin=None, stdout=open("/dev/null", "w"), stderr=None, executable="/bin/bash")
proc.wait()

Вызов .wait () будет блокироваться до завершения apt-get.

...