새 터미널을 열고 Linux에서 명령을 실행하는 Python 스크립트 만들기
- 새 터미널을 열고 Linux에서 명령을 실행하는 Python 스크립트 만들기
- Linux에서 Python 버전을 확인하는 Python 스크립트 만들기
- 열린 터미널을 활성 상태로 유지하고 그 안에서 명령을 실행하는 Python 스크립트
-
Linux에서 Python 하위 모듈
subprocess()
를 사용하여 새 터미널에 명령 전달 - 결론
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\"'")
코드는 무엇을 합니까?
-
Python 모듈
os
는 코드의 첫 번째 줄에서 가져옵니다. 이 모듈은 운영 체제에 명령을 전달하는 데 도움이 됩니다. -
실행해야 하는 명령줄 구문은
My_Cmmnd
라는 변수에 저장됩니다. 이 예제에 사용된 구문은 시스템의 Python 버전을 확인합니다.My_Cmmnd = "python3 --version"
-
코드의 세 번째 줄은 시스템에 명령을 보냅니다.
os.system("gnome-terminal -e 'bash -c \"" + My_Cmmnd + ";bash\"'")
위의 코드 스니펫은 다음을 수행합니다.
os.system()
은 하위 셸을 시작하고 대괄호 안의 명령을 실행합니다.gnome-terminal
명령은 Linux OS 내에서 새로운gnome-terminal
을 시작합니다.- 변수
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,
)
출력:
이 명령은 인수가 쉘에 전달될 때 문자열로 실행됩니다. 결과적으로 쉘은 subprocess()
실행 시작 시 문자열을 명령 인수로 해석합니다.
위 방법의 단점은 shell=true
를 사용하여 명시적으로 셸을 호출할 때 공백을 포함한 모든 메타 문자를 하위 프로세스에 전달하여 셸 삽입 이벤트에서 위협이 된다는 것입니다.
이러한 상황을 피하려면 Python 목록을 대신 사용하십시오. 목록을 사용할 때 호출할 명령은 목록의 0번째 인덱스에 배치되고 다른 인수는 그 뒤에 옵니다.
이전 예제에서 사용한 명령을 목록으로 호출합니다.
import subprocess
subprocess.run(["ls", "-la"])
출력:
명령의 결과는 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 스크립트를 만들 수 있습니다.