使用python在linux上运行系统命令?

时间:2012-02-16 17:56:53

标签: python linux

我想知道是否有人可以指导我一个例子或帮助我使用我的代码在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 个答案:

答案 0 :(得分:7)

由于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,您可能希望使用this backport代替。

请注意,如果您想要打印输出,则可以使用check_call调用子进程,因为默认情况下子进程会继承stdout,stderr和stdin。