2012-02-16 3 views
3

누군가가 나를 예제로 안내하거나 Linux (CentOS)에서 명령을 실행하기위한 코드를 도와 줄 수 있는지 궁금합니다. 기본적으로, 나는 새로운 기본 서버가 있다고 가정하고 구성하려고합니다. 나는 내가 달릴 필요가있는 명령을 나열 할 수 있다고 생각했으나 제대로 작동하지만 오류가 발생했습니다. 이 오류는 아무 것도하지 않는 것과 관련이 있습니다 (도둑질을 할 때).리눅스에서 파이썬을 사용하여 시스템 명령어를 실행하고 있습니까?

저는 파이썬이 코드를 실행하고 다른 코드를 보내고 각 명령이 실행을 마칠 때까지 기다리지 않고 (스크립트가 실패한 후 확인하고 절약 패키지가 다운로드되고 성공적으로 압축 해제됩니다.) 여기

코드입니다 :

#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 스크립트를 사용할 수 있지만 파이썬 기술을 향상 시키려고합니다).

+0

'os' 라이브러리의'system()'함수를 살펴 보았습니까? (http://docs.python.org/library/os.html#os.system) – yasouser

+0

os.system 함수는 Python에서 시스템 호출을 실행하는 데 권장되는 방법이 아니며 오랫동안 사용되지 않았습니다. @phihag가 아래 답변을하니 대신 [하위 프로세스 모듈] (http://docs.python.org/library/subprocess.html)을 확인하십시오. – michaelfilms

답변

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는 파이썬의 고대 버전을 유지하고 있기 때문에, 대신 this backport을 사용할 수 있습니다.

어쨌든 아웃풋을 출력하고 싶다면 서브 프로세스가 stdout, stderr 및 stdin을 기본적으로 상속하므로 서브 프로세스를 check_call으로 부를 수 있습니다.

+0

이 오류는 현재 발생하는 오류와 관련이 없을 수 있습니다. 우리가 당신을 돕기를 원하면 * 게시하십시오. – phihag

+0

물론, CentOS에는 작동하지 않는 고대 파이썬이 포함되어 있습니다 ... – geoffspear

+0

나는 그것을 테스트하고 알려 드리겠습니다. 내가 얻은 오류는 폴더/명령이 실행 중일 때 존재하지 않았지만 내가 가서 확인한 후에 거기에 있었다는 것입니다. 이전 명령이 끝날 때까지 기다리지 않고 명령이 실행되고있는 것 같습니다. 나는 당신의 코드를 시험해보고 그 결과를 볼 것이다. – Lostsoul

관련 문제