새 터미널을 열고 Linux에서 명령을 실행하는 Python 스크립트 만들기

Jay Shaw 2023년6월21일
  1. 새 터미널을 열고 Linux에서 명령을 실행하는 Python 스크립트 만들기
  2. Linux에서 Python 버전을 확인하는 Python 스크립트 만들기
  3. 열린 터미널을 활성 상태로 유지하고 그 안에서 명령을 실행하는 Python 스크립트
  4. Linux에서 Python 하위 모듈 subprocess()를 사용하여 새 터미널에 명령 전달
  5. 결론
새 터미널을 열고 Linux에서 명령을 실행하는 Python 스크립트 만들기

Linux 운영 체제는 프로그래머가 광범위하게 사용하는 다목적 터미널로 유명합니다. 그러나 동일한 구문 세트를 반복적으로 작성하는 경우가 있어 지루하고 시간이 많이 소요될 수 있습니다.

파일에 Linux 명령을 미리 작성한 다음 터미널에서 한 번에 실행하는 방법이 있는지 궁금한 적이 있습니까? 예! 당신은 할 수 있습니다.

미리 작성된 터미널 구문을 파일에 작성하고 Python Script를 작성하여 한 번에 실행할 수 있습니다. 이 문서에서는 Python 스크립트를 생성하여 새 터미널을 열고 명령을 실행하는 방법을 설명합니다.

새 터미널을 열고 Linux에서 명령을 실행하는 Python 스크립트 만들기

시작하기 전에 몇 가지 기본 사항을 수정하겠습니다. Python 스크립트는 파일을 찾은 다음 실행하여 명령줄 인터페이스에서 실행됩니다. 이 파일은 실행되고 출력을 표시합니다.

새 터미널을 열고 명령을 실행하는 Python 스크립트를 만드는 방법에는 여러 가지가 있습니다. 첫 번째 예는 시스템 내부의 Python 버전을 확인하기 위해 Linux 명령을 전달하는 Python 스크립트를 생성하는 방법을 보여줍니다.

Linux에서 Python 버전을 확인하는 Python 스크립트 만들기

터미널에 직접 명령을 작성하여 Python 버전을 확인해야 하는 경우 다음 구문이 사용됩니다.

python3 --version

아래와 같이 시스템 내부에 Python 버전이 표시됩니다.

jay@jay-virtual-machine:~$ python3 --version
Python 3.10.6

이것은 명령줄 구문으로, 터미널에서만 쓸 수 있음을 의미합니다. .py 확장자를 가진 텍스트 파일(예: test.py)에 일반 텍스트로 작성하려는 경우 오류가 발생합니다.

python3 --version

출력:

jay@jay-virtual-machine:~$ python3 test.py
Traceback (most recent call last):
  File "/home/jay/test.py", line 1, in <module>
    python3 --version
NameError: name 'python3' is not defined

이 문제를 해결하려면 Python 컴파일러와 터미널 모두에 구문이 의미가 있도록 Python 스크립트를 만들어야 합니다.

새 터미널을 열고 명령을 실행하는 Python 스크립트를 생성하려면 .py 확장자로 텍스트 파일을 생성하고 다음 구문을 작성합니다.

import os

My_Cmmnd = "python3 --version"
os.system("gnome-terminal -e 'bash -c \"" + My_Cmmnd + ";bash\"'")

코드는 무엇을 합니까?

  1. Python 모듈 os는 코드의 첫 번째 줄에서 가져옵니다. 이 모듈은 운영 체제에 명령을 전달하는 데 도움이 됩니다.

  2. 실행해야 하는 명령줄 구문은 My_Cmmnd라는 변수에 저장됩니다. 이 예제에 사용된 구문은 시스템의 Python 버전을 확인합니다.

    My_Cmmnd = "python3 --version"
    
  3. 코드의 세 번째 줄은 시스템에 명령을 보냅니다.

    os.system("gnome-terminal -e 'bash -c \"" + My_Cmmnd + ";bash\"'")
    

위의 코드 스니펫은 다음을 수행합니다.

  1. os.system()은 하위 셸을 시작하고 대괄호 안의 명령을 실행합니다.
  2. gnome-terminal 명령은 Linux OS 내에서 새로운 gnome-terminal을 시작합니다.
  3. 변수 My_Cmmnd 내용은 실행을 위해 새 터미널에 Bash 명령으로 전송됩니다.

스크립트는 구문을 실행하고 원하는 출력을 표시합니다.

Python 3.10.6
jay@jay-virtual-machine:~$

열린 터미널을 활성 상태로 유지하고 그 안에서 명령을 실행하는 Python 스크립트

마지막 예제에서는 새 터미널을 열고 명령을 변수에 저장하여 실행하는 Python 스크립트를 만드는 방법을 보여 주었습니다.

반면 구문이 한 줄 명령인 경우 변수에 저장하지 않고 직접 입력할 수 있습니다. .py 확장자로 파일을 만들고 다음 구문을 작성합니다.

import os

os.system("gnome-terminal -e 'bash -c \"python3 --version\" '")

위 구문은 새 터미널을 시작하고 명령을 실행합니다. 그러나이 방법을 사용하면 명령이 실행된 직후 터미널이 닫힙니다.

이 문제를 해결하려면 다음 명령으로 수면 타이머를 설정해야 합니다.

import os

os.system("gnome-terminal -e 'bash -c \"python3 --version; sleep 5\" '")

위의 구문은 요구 사항에 따라 늘릴 수 있지만 새 터미널을 5초 동안 열어 둡니다. 터미널을 무기한 활성 상태로 유지해야 하는 경우 아래 구문을 사용하십시오.

import os

os.system("gnome-terminal -e 'bash -c \"python3 --version; bash\" '")

이렇게 하면 사용자가 터미널을 닫을 때까지 터미널이 열린 상태로 유지됩니다.

Linux에서 Python 하위 모듈 subprocess()를 사용하여 새 터미널에 명령 전달

Python 하위 모듈 os를 사용하여 새 터미널을 열고 명령을 실행하는 Python 스크립트를 만드는 방법을 배웠습니다. 이 내장 라이브러리를 사용하여 터미널에 명령을 전달하는 것은 더 이상 권장되지 않습니다.

최신 버전의 Python에서는 os가 더 이상 사용되지 않기 때문입니다. 보안 위험을 방지하려면 Python 하위 모듈 subprocess를 대신 사용해야 합니다.

새 터미널을 열고 subprocess를 사용하여 명령을 실행하는 Python 스크립트를 생성하려면 이전 예제와 유사한 .py 확장자를 가진 파일을 생성하고 그 안에 다음 코드를 작성합니다.

import subprocess

My_Cmmnd = "ls"

process = subprocess.Popen(
    "gnome-terminal -e 'bash -c \"" + My_Cmmnd + ";bash\"'",
    stdout=subprocess.PIPE,
    stderr=None,
    shell=True,
)

UNIX 명령 ls는 현재 디렉토리의 파일을 나열합니다. 결과적으로 이 명령을 실행하면 현재 디렉터리에 있는 파일 목록이 표시됩니다.

subprocess() 모듈을 먼저 가져옵니다. 그런 다음 명령이 변수에 저장됩니다. process라는 변수 내에서 인수는 subprocess()에 대해 정의됩니다.

subprocess.Popen 생성자는 gnome-terminal -e 구문을 읽을 때 새 gnome-terminal 내에서 자식 프로세스를 시작합니다. 마지막으로 Python 스크립트는 새 터미널을 열고 명령을 실행합니다.

출력:

jay@jay-virtual-machine:~$ python3 test.py
Desktop    Downloads  Pictures	snap	   test2.py  Videos
Documents  Music      Public	Templates  test.py

Linux 셸이 제공하는 다른 기능에 대해 알아보려면 subprocess()를 사용하여 셸에 인수를 보내는 방법을 살펴보겠습니다. 예를 들어, 아래 프로그램의 명령인 ls -la는 모든 메타데이터와 숨겨진 파일을 나열합니다.

import subprocess

My_Cmmnd = "ls -la"

process = subprocess.Popen(
    "gnome-terminal -e 'bash -c \"" + My_Cmmnd + ";bash\"'",
    stdout=subprocess.PIPE,
    stderr=None,
    shell=True,
)

출력:

ls la 명령

이 명령은 인수가 쉘에 전달될 때 문자열로 실행됩니다. 결과적으로 쉘은 subprocess() 실행 시작 시 문자열을 명령 인수로 해석합니다.

위 방법의 단점은 shell=true를 사용하여 명시적으로 셸을 호출할 때 공백을 포함한 모든 메타 문자를 하위 프로세스에 전달하여 셸 삽입 이벤트에서 위협이 된다는 것입니다.

이러한 상황을 피하려면 Python 목록을 대신 사용하십시오. 목록을 사용할 때 호출할 명령은 목록의 0번째 인덱스에 배치되고 다른 인수는 그 뒤에 옵니다.

이전 예제에서 사용한 명령을 목록으로 호출합니다.

import subprocess

subprocess.run(["ls", "-la"])

출력:

ls la safe 명령

명령의 결과는 capture_output=True 옵션을 설정하여 변수에 저장할 수도 있습니다.

import subprocess

saved_results = subprocess.run(["ls", "-la"], capture_output=True)

print(saved_results.stdout)

출력:

캡처 출력

출력은 원하는 결과를 표시하지만 인덱싱이 없고 파일 이름이 정리되지 않은 상태로 퍼져 있음을 알 수 있습니다. 이는 시스템이 ls -la 명령의 결과를 바이트 단위로 저장했기 때문에 발생합니다.

대신 문자열로 결과를 얻으려면 text=True 옵션을 설정하십시오.

import subprocess

saved_results = subprocess.run(["ls", "-la"], capture_output=True, text=True)

print(saved_results.stdout)

출력:

문자열 출력

결론

이 문서에서는 Python 스크립트를 생성하여 새 터미널을 열고 명령을 실행하는 방법을 설명합니다. 기사를 읽는 독자는 Linux에서 쉽게 새 터미널을 열고 명령을 실행하는 Python 스크립트를 만들 수 있습니다.