Bash 스크립트에서 Python 사용하기

Bash 스크립트에서 Python 사용하기

Bash 스크립트 내에서 Python을 시작하려고 하면 스크립트 실행이 중지되고 "Python"을 호출한 후 명령이 실행되지 않습니다. 이 간단한 예에서는 "TESTPRINT"가 인쇄되지 않습니다. 대본은 거기서 멈춘 것 같았습니다.

#!/bin/bash

python

print("TESTPRINT")

Echo

Python을 입력한 후에도 스크립트가 계속 실행되도록 하려면 어떻게 해야 합니까? 나는 몇 년 전에 처음으로 Android 휴대폰에 쉘링이 필요한 스크립트를 작성한 후 동일한 문제에 직면했다고 생각합니다. 어떻게 해결됐는지 기억이 안 나네요.

답변1

스크립트에서 일련의 Python 명령을 실행하려면 bash실행할 명령을 Python 인터프리터에 제공해야 합니다. 이 명령은 아래와 같이 스크립트에서 생성한 파일(Python 스크립트)에서 실행할 수 있습니다.

#!/bin/bash -e

# Create script as "script.py"
cat >script.py <<'END_SCRIPT'
print("TESTPRINT")
END_SCRIPT

# Run script.py
python script.py

rm script.py

(이렇게 하면 이라는 새 파일이 생성되고, script.py이미 존재하는 경우 덮어쓰며, Python에 해당 파일을 실행하도록 지시한 다음 삭제합니다.)

...또는 여기에 설명된 대로 특정 형태의 리디렉션을 통해 직접적으로:

#!/bin/bash

python - <<'END_SCRIPT'
print("TESTPRINT")
END_SCRIPT

그 목적은 를 실행하여 python -Python 인터프리터에게 표준 입력에서 스크립트를 읽도록 지시하는 것입니다. 그런 다음 쉘은 END_SCRIPTPython 스크립트의 텍스트(쉘 스크립트에서 구분됨)를 Python 프로세스의 표준 입력 스트림으로 보냅니다.

위의 두 코드는 두 번째 스크립트의 Python 프로세스의 표준 입력이 읽고 있는 스크립트에 연결되어 있는 반면 첫 번째 스크립트의 Python 프로세스는 스크립트 외부의 표준 입력에서 자유롭게 데이터를 읽을 수 있다는 점에서 약간 다릅니다. . Python 코드가 표준 입력에서 읽는 경우 이는 중요합니다.

Python은 옵션을 통해 명령줄에서 직접 명령 세트를 가져올 수도 있습니다 -c.

#!/bin/bash

python -c 'print("TESTPRINT")'

너 뭐야할 수 없다스크립트 중간에 "Python으로 전환"하면 됩니다 bash.

스크립트에 포함된 명령은 bash차례로 실행되며 명령을 실행하는 동안 스크립트 자체는 해당 명령이 종료될 때까지 기다립니다(백그라운드 작업이 아닌 경우).

이는 원본 스크립트가 대화형 모드에서 Python을 시작하고 bashPython 프로세스가 종료될 때까지 스크립트 실행을 일시적으로 중단한다는 의미입니다. 그런 다음 스크립트는 print("TESTPRINT")쉘 명령으로 실행을 시도합니다.

ssh스크립트에 비슷한 질문을 사용하세요.

ssh user@server
cd /tmp
ls

(이것은 몇 년 전에 시도했다고 말한 것과 유사할 수 있습니다.)

이것은아니요원격 시스템에 연결하고 거기서 실행 cd하고 명령을 내리세요 ls. 원격 시스템에서 대화형 쉘을 시작하고 쉘이 종료되면 로컬로 cd실행됩니다 (스크립트에 다시 제어권 제공) .ls

대신 원격 시스템에서 명령을 실행하려면 다음을 사용하십시오.

ssh user@server "cd /tmp; ls"

(이것은 형편없는 예이지만 아마 이해가 되실 것입니다.)


아래 예는 제안 사항을 실제로 구현하는 방법을 보여줍니다. 하지만 몇 가지 경고 라벨과 경고가 함께 제공됩니다.이런 코드는 절대 작성하면 안 된다(왜냐하면 지저분해서 유지 관리가 불가능하고, 감히 말하면 꽤 나쁘기 때문입니다.)

python -
print("TESTPRINT")

실행하세요:

$ sh -s <script.sh
TESTPRINT

여기서 일어나는 일은 스크립트가 sh -s. (및 to ) 옵션은 -s표준 입력 스트림을 통해 도착하는 쉘 스크립트를 실행하도록 쉘에 지시합니다.shbash

그런 다음 스크립트가 시작되고 python -다음과 같이 알려줍니다.파이썬표준 입력 스트림을 통해 들어오는 모든 것을 실행합니다. 스트림의 다음 항목 sh -s은 Python 명령입니다. Python에서 상속되었기 때문입니다(따라서 스크립트 텍스트 파일에 연결됨) print("TESTPRINT").

그런 다음 Python 인터프리터는 시간이 부족하거나 Python 명령을 실행할 때까지 스크립트 파일에서 명령을 계속 읽고 실행합니다 exit().

답변2

Kusalananda의 답변 외에도 전체 스크립트를 Python으로 실행하려면 첫 번째 줄을 다음으로 변경 #!/usr/bin/env python3하고 일반 쉘 스크립트처럼 실행할 수 있습니다. 이렇게 하면 어떤 스크립트를 실행하기 위해 어떤 인터프리터를 사용해야 하는지 기억할 필요가 없습니다.

답변3

<<<(Here Strings) 연산자를 사용하여 행을 저장할 수도 있습니다 .

$ python <<< 'print("MyTest")'
MyTest

답변4

Bash 스크립트에서 Python 파일을 호출할 때 Python 경로를 설정할 수도 있습니다.

export PYTHONPATH=/tmp/python_dep.zip && python test_my.py

관련 정보