запускать системные команды на Linux с помощью Python? - PullRequest
3 голосов
/ 16 февраля 2012

Мне интересно, может ли кто-нибудь либо привести меня к примеру, либо помочь мне с моим кодом для запуска команд в linux (centos).По сути, я предполагаю, что у меня есть базовый свежий сервер и я хочу его настроить.Я думал, что мог бы перечислить команды, которые мне нужно выполнить, и это будет работать, но я получаю ошибки.Ошибки связаны с нечего делать (при совершении броска).

Я думаю, это потому, что (я только здесь предполагаю), что python просто отправляет код для запуска, а затем отправляет другую и другую и не ждет завершения выполнения каждой команды (после сбоя сценарияпроверьте и пакет thrift загружен и успешно распакован).

Вот код:

#python command list to setup new server
import commands
commands_to_run = ['yum -y install pypy autocon automake libtool flex boost-devel gcc-c++  byacc svn openssl-devel make  java-1.6.0-openjdk git wget', 'service mysqld start',
                'wget http://www.quickprepaidcard.com/apache//thrift/0.8.0/thrift-0.8.0.tar.gz', 'tar zxvf thrift-0.8.0.tar.gz',
                'cd thrift-0.8.0', './configure', 'make', 'make install' ]


for x in commands_to_run:
    print commands.getstatusoutput(x)

Есть предложения о том, как заставить это работать?Если мой подход совершенно неправильный, дайте мне знать (я знаю, что могу использовать скрипт bash, но я пытаюсь улучшить свои навыки работы с Python).

1 Ответ

7 голосов
/ 16 февраля 2012

Поскольку commands долгое время считалось устаревшим, вам действительно следует использовать subprocess, в частности subprocess.check_output.Также cd thrift-0.8.0 влияет только на подпроцесс, а не на ваш.Вы можете либо вызвать os.chdir , либо передать аргумент cwd в функции подпроцесса:

import subprocess, os
commands_to_run = [['yum', '-y', 'install',
                    'pypy', 'python', 'MySQL-python', 'mysqld', 'mysql-server',
                    'autocon', 'automake', 'libtool', 'flex', 'boost-devel',
                    'gcc-c++', 'perl-ExtUtils-MakeMaker', 'byacc', 'svn',
                    'openssl-devel', 'make', 'java-1.6.0-openjdk', 'git', 'wget'],
                   ['service', 'mysqld', 'start'],
                   ['wget', 'http://www.quickprepaidcard.com/apache//thrift/0.8.0/thrift-0.8.0.tar.gz'],
                   ['tar', 'zxvf', 'thrift-0.8.0.tar.gz']]
install_commands = [['./configure'], ['make'], ['make', 'install']]

for x in commands_to_run:
    print subprocess.check_output(x)

os.chdir('thrift-0.8.0')

for cmd in install_commands:
    print subprocess.check_output(cmd)

Поскольку CentOS поддерживает древние версии Python, вы можете использовать thisbackport вместо.

Обратите внимание, что если вы все равно хотите распечатать вывод, вы можете просто вызвать подпроцесс с помощью check_call, так как подпроцесс наследует ваши stdout, stderr и stdin по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...