在Linux上使用Python运行系统命令?

3
我想知道是否有人能够为我提供示例或帮助我运行Linux(CentOS)上的命令。基本上,我假设我有一个基本的新服务器并想要配置它。我认为我可以列出需要运行的命令,但是我遇到了错误。这些错误与无法制作thift有关。我认为这是因为(我只是假设)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技能)。


你有没有查看过os库中的system()函数?(http://docs.python.org/library/os.html#os.system) - yasouser
os.system函数不是在Python中运行系统调用的建议方式,而且已经有一段时间没有被推荐使用了。正如@phihag在下面的回答中所述,请查看subprocess模块 - michaelfilms
1个回答

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,您可能希望使用此后移版

请注意,如果您仍然想打印输出,只需使用check_call调用子进程,因为子进程默认继承您的stdout、stderr和stdin。


我会测试一下并让你知道结果。我之前遇到的错误是在运行时文件夹/命令不存在,但是我去检查后发现它们确实存在。我怀疑这些命令只是在没有等待前一个命令完成的情况下运行。我会尝试你的代码并查看结果。 - Lostsoul
你说得没错,使用Bash可能更容易,但我也想学习一下。到目前为止,你已经帮了我很多,我会自己尝试修改代码的。 - Lostsoul
好的,我可能会使用bash/python的混合体。 对于像上面这样简单的事情,我可能会使用bash,对于需要某种逻辑的事情(如果文件存在...做这个,如果没有做那个),我会使用python。 一个问题,Python 2.7和2.6有性能差异吗? 我在我的Macbook上使用2.7,但代码似乎也在2.6上工作,所以我想坚持使用2.6,但许多人建议我升级,为什么? 我似乎注意不到任何区别。 - Lostsoul
嗯,在bash中,您也可以进行文件存在检查,例如使用test命令。建议使用更新的Python并不是因为性能原因(单个子进程的创建很容易超过整个Python程序的执行时间),而是因为有用的功能,如subprocess.check_output需要为旧版本的Python进行后移。Python 3.x消除了许多2.x版本的奇怪问题。 - phihag
@phihag 好的,谢谢。我会考虑升级并稍微调整一下代码。我读了很多关于Python3的书,但因为我的许多库仍然在2上,所以我没有使用过3。这可能是一个很好的机会来使用版本3。非常感谢Philhag! - Lostsoul
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接