
터미널을 사용하지 않고 새 프로세스를 시작하지만 출력을 위해 새 터미널 창을 여는 것과 같습니다 xfce4-terminal -e bash -c 'myCommand'
(입력도 허용해야 함)? 새로운 표시 터미널이 완료될 때까지 원래 터미널(어쨌든 표시되지 않음)을 중지하고 싶습니다.
위 명령을 호출하는 Python GUI가 있다고 가정해 보겠습니다. 새로 열린 터미널 창에서 명령을 실행할 때 Python 스크립트를 중지하고 중지한 후에도 계속 진행하고 싶습니다.
편집: 내 상황에 대한 추가 정보 요청에 대한 응답으로 더 구체적으로 다음과 같습니다.
Python 3.x를 사용하여 IDE를 만들고 GUI에는 Tkinter를 사용했습니다. GUI 기반 프로그램이기 때문에 열려 있는 터미널 창이 없습니다(만약 프로그램이 있었다면 어쨌든 백그라운드에 있을 것이며 전체 IDE가 GUI).
나는 선택한 텍스트의 비대칭 암호화를 위해 gpg 명령줄 도구를 사용하기로 선택했습니다(이 질문의 범위를 벗어나는 다른 더 중요한 용도의 Python 모듈보다 더 편리하고 문서화되어 있습니다. 컴파일 바이너리를 사용하면 라이센스 문제가 많지 않습니다.) 대칭 암호화의 경우 열린 터미널 창이 필요하지 않기 때문에 문제가 없지만 비대칭 암호화는 중요할 수도 있고 중요하지 않을 수도 있는 추가 입력을 요구하는 경향이 있으며 사용자는 이러한 프롬프트에 응답해야 합니다.
암호화하려는 텍스트를 임시 파일에 저장하는 반면, gpg는 파일 전체를 암호화합니다(텍스트가 임의로 길 수 있으므로 파일로 저장하지 않고 터미널에 출력하면 문제가 발생할 수 있습니다).
따라서 사용자가 텍스트를 선택하고 메서드를 실행할 때 gpg 프롬프트와 함께 터미널 창이 팝업되기를 원합니다. 이상적으로는 사용자가 "예" 또는 "아니요"라고 말하고 Enter를 누르면 선택한 텍스트가 비대칭으로 암호화된 텍스트로 대체됩니다. 그러나 실제로 일어나는 일은 터미널 창이 팝업되고 프로그램이 실제로 암호화하기 전에 암호화된 텍스트를 얻으려고 시도한다는 것입니다(사용자가 아무 것도 입력할 때까지 기다리지 않기 때문입니다). 나는 사용자가 "예" 또는 "아니요"라고 말한 후 암호화할 시간임을 IDE에 수동으로 알리는 것을 원하지 않습니다.
파이프를 사용하여 GUI 기반 사용자 입력을 숨겨진 터미널로 라우팅할 수 있다고 생각할 수도 있습니다. 그러나 작동하지 않는 등 이상한 이유로 인해.y | gpg -a --encrypt --recipient [email protected] tempFile.txt
답변1
새 터미널 에뮬레이터를 실행하면 새 터미널이 생성됩니다(Linux의 경우). 출력하기 위해 해당 터미널에서 프로그램을 시작할 필요는 없습니다(터미널에서 실행한 다음 다른 터미널에서 실행해 보세요). 따라서 Python 스크립트에 터미널에서 읽고 쓰도록 지시할 수 있습니다. 필요한 것은 장치 파일의 경로를 찾는 것뿐입니다./dev/pts/NUMBER
tty
echo hello >/dev/pts/NUMBER
xterm을 사용하면 매우 간단합니다. xterm -e 'tty >&3; myCommand'
파이프에 연결된 파일 설명자 3을 사용하여 실행하면 프로그램이 터미널 장치에 대한 경로를 읽습니다.
p = subprocess.Popen("xterm -e 'tty >&3; exec sleep 99999999' 3>&1",
shell=True, stdout=subprocess.PIPE)
tty_path = readline(p.stdout)
tty = open(tty_path, 'r+')
이제 Python 프로그램이 읽고 쓸 수 있습니다 tty
. 완료되면 터미널 에뮬레이터( os.kill(p.pid, signal.SIGTERM)
)를 닫습니다.
여러 창이 있는 단일 프로세스를 기반으로 하는 터미널 에뮬레이터(예: xfce4-terminal)를 사용하면 원하는 작업이 훨씬 더 어렵습니다. 실행하면 xfce4-terminal
터미널 에뮬레이터의 상위 프로세스와 하위 프로세스 간의 링크가 끊어지고 종료하기에 좋은 PID가 제공되지 않습니다. 명명된 파이프를 사용하여 통신할 수 있지만 설정하기가 더 어려운 봇입니다.
답변2
당신이 해야 할 일은 그것을 달성하고자 하는 방법과 정반대인 것 같습니다. 예를 들어 - Python 터미널이 아닌 이유는 무엇입니까?어쨌든 표시됨? 제 생각에는 이것이 새 터미널을 구입하는 데 시간을 낭비하는 대신 사용해야 하는 터미널입니다.
나는 이렇게 할 것 같아요:
-m
원래 터미널에서 모니터링 셸을 시작합니다.터미널 창을 아이콘화합니다.
Python 작업을 시작하세요.
두 번째 터미널을 호출하려면 Python이 자체적으로 SIGSTOP을 보내도록 합니다.
디스플레이 터미널.
명령을 내리세요.
완료되면 터미널과
fg
Python을 다시 숨깁니다.