2012-02-16 41 views
3

我想知道如果有人可以指导我的例子或帮助我与我的代码在Linux(centos)上运行命令。基本上,我假设我有一个基本的新服务器,并希望配置它。我想我可以列出我需要运行的命令,它会工作,但我得到的错误。这些错误与无关紧要(在制作过程中)有关。使用python在linux上运行系统命令?

我想这是因为(我只是假设在这里),python只是发送代码运行,然后发送另一个和另一个,而不是等待每个命令完成运行(脚本失败后,我检查并节俭包被下载并成功解压缩)。

下面的代码:

#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技能)。

+0

你看过'os'库中的'system()'函数吗? (http://docs.python.org/library/os.html#os.system) – yasouser 2012-02-16 18:02:59

+0

os.system函数不是在Python中运行系统调用的建议方式,并且还没有一段时间。正如@phihag下面的答案,请查看[subprocess module](http://docs.python.org/library/subprocess.html)。 – michaelfilms 2012-02-16 18:10:20

回答

7

由于commands已被弃用很长一段时间,您应该真的使用subprocess,特别是subprocess.check_output。另外,cd thrift-0.8.0仅影响子流程,而不是您的。您可以拨打os.chdircwd参数传递给子功能:

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。

+0

请注意,这可能与您收到的错误无关。如果你想让我们帮助你,*发布*。 – phihag 2012-02-16 18:08:20

+0

当然,CentOS附带一个古老的Python,在那里不起作用... – geoffspear 2012-02-16 18:09:34

+0

我会测试它并让你知道。我得到的错误是文件夹/命令在运行时不存在,但在我去之后检查它们在那里。我怀疑这些命令正在运行,而没有等待前一个命令完成。我会试一试你的代码并看看结果。 – Lostsoul 2012-02-16 18:13:40