我想知道是否有人可以指导我一个例子或帮助我使用我的代码在
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技能).
最佳答案 由于命令已经被弃用了很长时间,你应该真正使用子进程,特别是
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.