쉘 스크립트를 사용하여 Python 환경에 들어가서 일부 Python 명령을 실행하고 일반 터미널로 돌아가는 방법

쉘 스크립트를 사용하여 Python 환경에 들어가서 일부 Python 명령을 실행하고 일반 터미널로 돌아가는 방법

죄송합니다. 제목이 명확하지 않을 수 있습니다. 내 의심에 대한 완전한 설명은 다음과 같습니다. 아래 쉘 스크립트를 작성 중이며 언급된 출력을 기대합니다.

#!/bin/bash
python3
print("Hello World")
exit()
echo "The execution is completed"

내가 예상하는 출력은 python3 인터프리터로 가서 및 명령을 실행해야 하며 print, exit()수동으로 수행 exit()하면 명령을 실행한 후 인터프리터가 종료된 다음 명령을 실행한다는 것입니다. 그러나 실행 후에 echo는 그렇게 작동하지 않습니다. python3python3 인터프리터를 입력했지만 print실행 되지 않습니다 exit().

>>>

python3에 올바르게 들어간 다음 Python 인터프리터를 수동으로 종료할 때까지 그대로 유지됩니다.

예상되는 결과를 얻으려면 어떤 변경을 해야 합니까?

  1. 후속 질문: Hello worldPython 인터프리터 또는 기타 출력에서 ​​생성된 출력을 bash 환경으로 가져와 bash 스크립트에서 사용할 수 있습니까? 2. python 명령을 실행하기 위해 지정한 방법이 다른 도구에서도 작동합니까?

답변1

#!/bin/bash
python3
print("Hello World")
exit()
echo "The execution is completed"

스크립트는 터미널에 직접 명령을 입력하는 것과 같은 방식으로 작동하지 않습니다. 하고 싶은 일이 쉽게 이뤄지지 않습니다.

#!/bin/bash줄은 시작하려는 프로그램이 사용되어야 한다는 것을 커널에 알려줍니다 /bin/bash. 따라서 커널을 실행할 때 bash는 ./scriptname표준 입력 대신 표준 입력(터미널)에서 /bin/bash ./scriptname명령을 읽 습니다.scriptname

bash가 이 python줄에 도달하면 Python 인터프리터를 시작하고 다음 줄로 진행하기 전에 종료될 때까지 기다립니다. Python이 시작되면 python터미널에 입력할 때와 동일한 작업을 수행하고 대화형 인터프리터가 시작됩니다.

Python은 스크립트 파일에서 명령을 실행하고 싶어한다는 사실을 모르고 몇 줄을 건너뛰도록 지시할 수도 없습니다.
Python이 종료되면 bash는 다음 줄부터 계속됩니다. quit()이는 구문 오류이며 Bash에게 다음 줄을 건너뛰라고 지시할 수 없습니다 python.

Python이 명령을 실행하도록 하는 방법에는 세 가지가 있습니다.

  1. Bash가 구분된 문서(*1)를 통해 Python의 입력에 명령을 작성하도록 합니다. 이렇게 하면 Python이 터미널에서 사용자 입력을 읽을 수 없습니다.
  2. -c짧은 명령 목록을 제공하려면 이 옵션을 사용하십시오 . 이는 매우 짧은 프로그램에서만 작동하며 (문자열의 경우) 따옴표를 사용할 필요가 없습니다. 여러 명령은 세미콜론으로 구분할 수 있습니다.
  3. 두 번째 파일이 필요한 별도의 Python 스크립트가 있습니다. 임시 파일(*2)과 관련된 보안 위험을 알고 있는 경우 필요한 경우 bash에서 파일을 생성하도록 할 수 있습니다. 파일을 만들지 마십시오 /tmp.

후속 질문: Hello world 출력이나 Python 인터프리터에서 생성된 다른 출력을 bash 환경으로 가져와 bash 스크립트에서 사용할 수 있습니까?

$(및 를 사용하여 명령 대체를 사용할 수 있으며 )큰따옴표로 묶인 문자열 안에 사용할 수 있습니다. 다음과 같이 큰따옴표로 묶인 문자열을 중첩할 수도 있습니다.

test="$(python -c "import sys; print(sys.version)")"
echo "Python has finished"
echo "test = $test"

Python 명령 실행을 지정하는 방식이 다른 도구에서도 작동합니까?

위에 나열된 세 가지 방법은 모두 다른 많은 스크립팅 언어에서도 작동합니다.


*1 Heredoc의 예

read -p "How many numbers: " n
python <<END
for i in range($n):
    print(i)
print("Literal dollar sign \$")
END

<<END구문을 사용하면 쉘(bash)은 단어를 읽을 때까지 모든 줄을 읽습니다 END. END줄의 시작 부분에 있어야 합니다 .

이렇게 하면 따옴표를 이스케이프 처리할 필요가 없습니다. 쉘은 여전히 ​​달러 기호를 해석하므로 변수를 사용할 수 있습니다. 실제 달러 기호를 원한다면 다음과 같이 이스케이프 처리해야 합니다 \$.


*2 위험한 임시 파일의 예.이 코드를 사용하지 마세요

cat >/tmp/python-script <<END
for i in range(10):
    print(i)
END
python /tmp/python-script

다른 사람이 /tmp/python-script먼저 생성하면 파일을 덮어쓸 수 없으면 쉘 스크립트가 중지되지도 않습니다. 시스템의 악의적인 사용자가 의도한 스크립트 대신 실행될 유해한 Python 스크립트를 생성할 수 있습니다.

잘못될 수 있는 것은 그것뿐만이 아닙니다.

이를 안전하게 수행하는 방법에는 여러 가지가 있지만 가장 쉬운 방법은 현재 작업 디렉터리나 홈 디렉터리 내의 전용 디렉터리에 파일을 만드는 것입니다.

cat >dopythonstuff <<END
...
END
python dopythonstuff
rm dopythonstuff

답변2

Python을 사용하여 bash 스크립트를 시작하고 변수를 bash 스크립트에 전달합니다.

Python 변수 값을 bash 스크립트로 전송(Python 스크립트 내)

Python 스크립트에서 셸 명령을 호출하는 방법에 대한 이 스택 오버플로 질문에는 62개의 답변이 있습니다.

https://stackoverflow.com/questions/89228/how-to-call-an-external-command

Python을 종료한 다음 쉘 명령을 호출할 수 없습니다. Python 스크립트를 종료하기 전에 쉘 명령을 호출해야 합니다.

https://www.geeksforgeeks.org/python-exit-commands-quit-exit-sys-exit-and-os-_exit/

위 링크 아래의 이 기사에서는 다양한 명령을 사용하여 Python을 종료하는 방법을 설명합니다.

quit(), exit(), sys.exit() 및 os._exit() 함수는 스택 추적을 인쇄하지 않고 Python 인터프리터가 종료되는 SystemExit 예외를 발생시킨다는 점에서 거의 동일한 기능을 갖습니다. 조기 종료를 가로채고 정리 활동을 수행하기 위해 예외를 포착할 수 있습니다. 포착되지 않으면 인터프리터가 정상적으로 종료됩니다.

기사는 다음과 같이 결론을 내렸습니다.

위의 네 가지 종료 함수 중에서 sys.exit()는 프로덕션 코드에서 사용할 수 없기 때문에 sys.exit()가 선호되는 반면, os._exit()는 즉각적인 종료가 필요한 특수한 경우에만 적합합니다.

sys.exit("Exit message here")를 사용하여 Python 스크립트를 종료하고 콘솔에 종료 메시지를 작성한 다음 쉘 프롬프트로 돌아갈 수 있습니다.

관련 정보