파이썬 코드에서 쉘 스크립트를 호출하는 방법은 무엇입니까?


210

파이썬 코드에서 쉘 스크립트를 호출하는 방법은 무엇입니까?

답변:


252

서브 프로세스 모듈은 당신을 도울 것입니다.

명백히 사소한 예 :

>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0 
>>> 

test.sh간단한 쉘 스크립트는 어디에 있으며이 0실행에 대한 리턴 값입니다.


11
참고 : subprocess.call ()을 문자열 대신 목록에 전달하는 것이 좋습니다 (예와 이유는 아래의 Hugo24에 명령 참조).
Jim Dennis

1
튜토리얼 링크가 끊어졌습니다.
Kshitij Saraogi

6
OSError : [Errno 13] 권한이 거부되었습니다. 내 스크립트는 sudo로 실행할 필요가 없습니다. @Manoj Govindan
alper

6
인수 : subprocess.call ([ './ test.sh', 'param1', 'param2'])
Henry

2
@alper는 스크립트를 저장 한 폴더로 이동하여 명령을 실행합니다 chmod +x script.sh. 참고 : script.sh는 스크립트의 자리 표시 자이므로 적절하게 바꿉니다.
Tom J Muthirenthi '

105

os.popen()(더 이상 사용되지 않음) 또는 전체 subprocess모듈을 사용하는 몇 가지 방법 있지만 이 방법은

import os
os.system(command)

가장 쉬운 방법 중 하나입니다.


1
이것이 왜 가장 많이 답이되지 않습니까? 더 나은 솔루션으로 모듈을 가져올 필요가 없습니까? 여기에 단점이 있습니까?
boulder_ruby

6
으로 subprocess당신은 입력 / 출력 / 오류 파이프를 관리 할 수 있습니다. 인수가 많은 경우에도 더 좋습니다 . 간단한 인수 목록이있는 os.command()특수 문자를 이스케이프 처리하여 전체 명령 행을 작성해야합니다 subprocess. 그러나 간단한 작업으로 os.command() 는 충분할 수 있습니다.
Michał Niklas

1
해당 링크에서 인용하려면 :The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
Maximilian

42

쉘 스크립트에 일부 매개 변수를 전달하려는 경우 shlex.split () 메소드를 사용할 수 있습니다 .

import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))

test.sh같은 폴더에 :

#!/bin/sh
echo $1
echo $2
exit 0

출력 :

$ python test.py 
param1
param2

이것은 우아하다.
caleb


15

위에서 언급 한대로 서브 프로세스 모듈을 사용하십시오.

나는 이것을 다음과 같이 사용한다 :

subprocess.call(["notepad"])

13
참고 : 목록을 사용하여 하위 프로세스를 호출하면 구문 분석 / 해석을 위해 쉘을 통해 (위생되지 않은) 문자열을 전달할 필요가 없으므로 안전합니다. 목록의 첫 번째 항목은 실행 파일이며 다른 모든 항목은 인수로 전달됩니다.
Jim Dennis

13

파이썬 3.5를 실행 중이며 subprocess.call ([ './ test.sh'])이 작동하지 않습니다.

나는 당신이 세 가지 해결책을 당신이 출력으로하고 싶은 것에 달려 있습니다.

1-스크립트를 호출하십시오. 터미널에 출력이 표시됩니다. 출력은 숫자입니다.

import subprocess 
output = subprocess.call(['test.sh'])

2-문자열에 대한 호출 및 덤프 실행 및 오류. (stdout)을 인쇄하지 않으면 터미널에서 실행이 보이지 않습니다. Shell = Popen의 인수로 True가 작동하지 않습니다.

import subprocess
from subprocess import Popen, PIPE

session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()

if stderr:
    raise Exception("Error "+str(stderr))

3-스크립트를 호출하고 temp_file에서 temp.txt의 에코 명령을 덤프하십시오.

import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
    output = file.read()
print(output)

doc 하위 프로세스를 살펴 보는 것을 잊지 마십시오


1
참고 stdout = PIPE 또는 stderr = PIPE를와 함께 사용하지 마십시오 subprocess.call. 파이프를 읽을 때 OS 파이프 버퍼를 채우기 위해 파이프에 충분한 출력을 생성하면 하위 프로세스가 차단됩니다.

4

서브 프로세스 모듈은 서브 프로세스를 시작하기에 좋은 모듈입니다. 이를 사용하여 다음과 같이 쉘 명령을 호출 할 수 있습니다.

subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)

당신은 그것의 문서를 볼 수 있습니다 여기에서 .

스크립트를 일부 .sh 파일이나 긴 문자열로 작성한 경우 os.system 모듈을 사용할 수 있습니다. 상당히 간단하고 전화하기 쉽습니다.

import os
os.system("your command here")
# or
os.system('sh file.sh')

이 명령은 스크립트를 한 번 실행하여 완료하고 종료 될 때까지 차단합니다.


sys도 가져 오지 않아도 되나요?
ScottyBlades

아닙니다. 파이썬 쉘
Descartes

4

스크립트에 여러 개의 인수가있는 경우

#!/usr/bin/python

import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output

출력은 상태 코드를 제공합니다. 스크립트가 성공적으로 실행되면 0이 아닌 정수가됩니다.

podname=xyz  serial=1234
0

아래는 test.sh 쉘 스크립트입니다.

#!/bin/bash

podname=$1
serial=$2
echo "podname=$podname  serial=$serial"

2

하위 프로세스는 좋지만 일부 사람들은 스크립트를 더 좋아할 수 있습니다 . Scriptine에는 shell.call (args) , path.rename (new_name)path.move (src, dst) 와 같은 고급 메소드 세트가 있습니다 . 성경은 하위 프로세스 및 기타를 기반으로 합니다.

스크립트의 두 가지 단점 :

  • 현재 문서 수준은 충분하더라도 더욱 포괄적입니다.
  • 하위 프로세스와 달리 스크립트 패키지는 현재 기본적으로 설치되어 있지 않습니다.

2

나는 이것이 오래된 질문이라는 것을 알고 있지만 최근에 이것을 우연히 발견 했으며 파이썬 3.5 이후 변경된 서브 프로세스 API 이후로 나를 잘못 안내했습니다 .

외부 스크립트를 실행하는 새로운 방법은 runargs로 설명 된 명령을 실행하는 함수를 사용하는 것입니다. 명령이 완료되기를 기다린 다음 CompletedProcess 인스턴스를 반환합니다.

import subprocess

subprocess.run(['./test.sh'])

1

쉘 스크립트 파일에 실행 권한이 없으면 다음과 같이하십시오.

import subprocess
subprocess.run(['/bin/bash', './test.sh'])

-9

다음 코드를 시도하십시오 :

Import Execute 

Execute("zbx_control.sh")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.