Python 내에서 bash 스크립트 실행


105

다음 코드에 문제가 있습니다.

callBash.py :

import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"

sleep.sh :

sleep 10

10 초 후에 "끝"을 인쇄하고 싶습니다. (저는 이것이 멍청한 예라는 것을 알고 있습니다. 저는 단순히 파이썬 내에서 잠을 잘 수 있지만이 간단한 sleep.sh 파일은 단지 테스트였습니다)


나는 또한 그것을 시도 "! $ 빈 / bash는, 잠 10;"
user1638145

이 질문이 어떤 문제에 대해 묻고 자하는지는 불분명하지만, 대답으로 다소 좋은 추측에 대한 역사적인 짐을 쌓았 기 때문에 질문은 남아 있어야합니다. 아마도 특정 오류를 검색하거나 stackoverflow.com/questions/4256107/…
tripleee

답변:


91

sleep.sh를 실행 가능하게 만들고 shell=True(이전 답변에서 제안한대로) 매개 변수 목록에 추가 하면 정상적으로 작동합니다. 검색 경로에 따라 ./또는 다른 적절한 경로 를 추가해야 할 수도 있습니다 . (즉,로 변경 "sleep.sh"합니다 "./sleep.sh".)

shell=True매개 변수는 bash는 스크립트의 첫 번째 라인은 쉘의 경로 인 경우 (리눅스와 같은 POSIX의 시스템에서) 필요하지 않습니다; 예 : #!/bin/bash.


48

경우 sleep.sh오두막을 가지고 #!/bin/sh있으며 적절한 파일 권한이 - 실행 chmod u+rx sleep.sh확인하고이에 $PATH로 작동합니다 코드는 다음 :

import subprocess

rc = subprocess.call("sleep.sh")

스크립트가 PATH에 없으면 전체 경로를 지정하십시오 (예 : 현재 작업 디렉토리에있는 경우).

from subprocess import call

rc = call("./sleep.sh")

스크립트에 shebang이 없으면 다음을 지정해야합니다 shell=True.

rc = call("./sleep.sh", shell=True)

스크립트에 실행 권한이없고 변경할 수없는 경우 예를 들어 실행 os.chmod('sleep.sh', 0o755)하여 스크립트를 텍스트 파일로 읽고 subprocess대신 모듈에 문자열을 전달할 수 있습니다 .

with open('sleep.sh', 'rb') as file:
    script = file.read()
rc = call(script, shell=True)

34

사실, shell=True인수 를 추가하기 만하면됩니다 .

subprocess.call("sleep.sh", shell=True)

그러나 조심하십시오-

경고 shell = True로 시스템 셸을 호출하는 것은 신뢰할 수없는 입력과 결합 된 경우 보안 위험이 될 수 있습니다. 자세한 내용은 자주 사용되는 인수 아래의 경고를 참조하십시오.

출처


1
가없는 경우 작동 sleep.sh하지 않습니다 PATH. 이 경우 입니다 경로와 올바른 오두막을 가지고 당신은 필요가 없습니다 shell=True. 보기 내 대답을
JFS

16

인수로 스크립트호출하려는 사람

import subprocess

val = subprocess.check_call("./script.sh '%s'" % arg, shell=True)

전달하기 전에 str (arg)을 사용하여 args를 문자열로 변환해야합니다.

원하는만큼 많은 인수를 전달하는 데 사용할 수 있습니다.

subprocess.check_call("./script.ksh %s %s %s" % (arg1, str(arg2), arg3), shell=True)

10

sleep.sh실행 권한이 있는지 확인하고 다음 을 사용하여 실행하십시오 shell=True.

#!/usr/bin/python

import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"

그래서 그것은 shell = True 내가 놓쳤다. sh 스크립트의 첫 번째 줄에 #! bin / bash를 설정하는 것만으로는 충분하지 않은 이유를 설명해 주시겠습니까?
user1638145

3
에서 오류 #!bin/bash가 없습니다 /. #!/bin/bash답변에서 메모 한대로 작동합니다.
James Waldby-jwpat7

9

chmod가 작동하지 않으면 시도하십시오

import os
os.system('sh script.sh')
#you can also use bash instead of sh

감사합니다


os.system문서는 특히 찬성을 피하는 것이 좋습니다 subprocess(이 일을 subprocess.run()). subprocess일할 수 없다면 문제가 생길 가능성이 있습니다 os.system().
tripleee

3

파이썬에서 bash 스크립트를 실행하는 방법을 묻고 나서 여기에 지시 되었기 때문에 답변을 추가하십시오. OSError: [Errno 2] file not found스크립트가 매개 변수를 사용 하면 오류가 발생 합니다. 예를 들어 스크립트가 절전 시간 매개 변수 subprocess.call("sleep.sh 10")를 사용했다고 가정 해 보겠습니다. 작동하지 않습니다 . 이를 배열로 전달해야합니다.subprocess.call(["sleep.sh", 10])


당신은 의 실제 의미shell=True 를 이해해야 하지만 예, 일반적으로 그것을 피하는 것이 당신의 최선의 플레이입니다.
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.