저는 Django
새 터미널을 열고 docker exec
.
이것이 내가 구현한 방법입니다.
current_os = platform.system()
exec_command = f"docker exec -it {container_id} /bin/{shell}"
if current_os == "Windows":
command = f"start powershell /c {exec_command}"
elif current_os == "Darwin":
command = f"osascript -e 'tell app \"Terminal\" to do script \"{exec_command}\"'"
elif current_os == "Linux":
command = f"gnome-terminal -- sh -c \"{exec_command}\"" # TODO tests
else:
raise Exception("An unknown OS was detected. Unable to open a terminal.")
if os.system(command) != 0:
raise Exception("There was an error opening a new terminal.")
내 질문은: gnome-terminal
실제로 대부분의 배포판에서 작동합니까? 그렇지 않다면 어떻게 처리해야 합니까? 얼마나 오류 방지 기능이 있나요? 인터넷을 검색해도 실제 해결책이 나오지 않았습니다.
터미널을 열 때 자동으로 명령을 실행하고 싶은데, 명령을 실행한 후 터미널이 닫히지 않도록 하는 속성이 필요하다는 점을 명심하세요.
Ubuntu 20.04에서만 Linux 사례를 테스트할 수 있습니다.
답변1
사람들이 이미 지적했듯이 "Linux" 같은 것은 없습니다. "Debian", "Fedora", "Arch", "Gentoo" 등이 있으며 그 변형도 있습니다. 이 모든 기능을 사용할 수 있다고 확신할 수는 /bin/sh
있지만할 수 없다특정 터미널 애플리케이션이 설치된다고 가정합니다.
일반적인 터미널 응용 프로그램 목록을 만든 다음 작동하는 응용 프로그램을 찾을 때까지 반복할 수 있습니다. 예를 들면 다음과 같습니다.
import random
import subprocess
class NoTerminalError(Exception):
pass
possible_terminals = [
('lxterminal', lambda cmd: ['lxterminal', '-e', '/bin/sh', '-c', cmd]),
('xfce4-terminal', lambda cmd: ['xfce4-terminal', '-x', '/bin/sh', '-c', cmd]),
('xterm', lambda cmd: ['xterm', '-e', '/bin/sh', '-c', cmd]),
('gnome-terminal', lambda cmd: ['gnome-terminal', '--', "/bin/sh", "-c", cmd]),
]
def find_terminal():
random.shuffle(possible_terminals)
for name, cmdline in possible_terminals:
try:
subprocess.run(cmdline("/bin/true"), check=True)
return name, cmdline
except subprocess.CalledProcessError:
pass
raise NoTerminalError()
name, cmdline = find_terminal()
print('using terminal', name)
subprocess.run(cmdline('cmatrix'), check=True)
또는 문서에 "이 프로그램에는 다음이 필요합니다.여기에 이름을 입력하세요".