문제

현재 디렉토리에 Python 파일 목록을 작성하고 각각에 대한 버튼을 생성하는 TK Python 프로그램이 있습니다. 버튼을 클릭하면 해당 파이썬 프로그램이 새로운 그놈 말단에서 하위 프로세스를 통해 시작됩니다. 서브 프로세스가 새 터미널에서 실행 된 후 버튼의 색상을 빨간색으로 전환하고 싶습니다. 불행히도 버튼은 거의 즉시 색상이 변경됩니다.

from Tkinter import *
import os, subprocess

root = Tk()
buttonsD = {}

def launch(ourfile):
    p=subprocess.Popen(["gnome-terminal","-e","python " + ourfile], shell=False)
    buttonsD[ourfile].configure(bg='red')

dirlist=os.listdir(os.getcwd())
for fname in dirlist:
    if fname.endswith('py') and fname != 'gui2.py':
        buttonsD[fname] = Button(root,text=fname,command=lambda i=fname: launch(i))
        buttonsD[fname].pack(side=TOP,expand=YES,fill=BOTH)

root.mainloop()

거의 즉시 P.Poll == None 동안 기다릴 수 있다는 것을 의미하며, 그놈 말단이 생성되는 데 잠시 시간이 걸린다는 것을 알 수 있습니다. 그러나 터미널이 생성 되 자마자 새로운 터미널에서 프로세스가 여전히 실행 중이지만 버튼은 빨간색으로 간다. 새로운 그놈 말단을 만들 수없고 실행하고 싶은 프로세스를 전달할 수 없습니다. Gnome-Terminal은 새로운 Bash 인스턴스를 생성 한 다음 완료된 것으로 보이므로 Stdin과 통신하려고하면 파이프 오류가 발생합니다.

도움이 되었습니까?

해결책

나는 그놈 터미널이 부모의 프로세스 그룹과 분리하기 위해 더블 포크를 수행하고 있다고 생각합니다. 따라서 실제로 당신의 하위 프로세스는 거의 즉시 종료되고, 당신이 관찰하는 것처럼, 당신이 직접적인 후손으로 모든 일이 일어나고 있습니다. 액세스.

불행히도 나는 그놈 터미널 이이 이중 포크 거동을 비활성화 할 수있는 방법을 제공한다고 생각하지 않습니다. 따라서 "추가 후손"이 언제 완료되었는지 알아 보려면 해당 프로세스를 식별하고 주기적으로 모니터링해야합니다. 그것과 직접 상호 작용하는 것은 또한 꽤 큰 순서입니다. 당신이 관련이없는 "무작위"프로세스와 상호 작용하는 것보다 쉽지 않습니다 :-(.

다른 팁

여기에는 두 가지 질문이 있습니다. 그놈 말단에서 Python 프로그램을 시작하는 데 사용할 명령 줄과 사용 방법 subprocess Tkinter 앱에서. 나는 후자에 대해서만 알고있다.

subprocess.Popen 즉시 반환되므로 버튼이 즉시 빨간색으로 변하는 이유입니다. 나는 당신이 아마도 어떤 프로그램이 실행 중인지 목록을 만들어야한다고 생각합니다. 그런 다음 함수를 작성하십시오 poll_processes 어떤 전화 poll() 각 실행 프로세스에서 및 결과가 그렇지 않은 경우 None, 목록에서 제거하고 버튼을 빨간색으로 바꿉니다.

그런 다음 Tkinter가 주기적으로 해당 함수를 호출하도록 배열하는 것입니다. frame.after(msec, poll_processes) 첫 번째 전화를 예약합니다 poll_processes 그리고 와서 poll_processes 다음 전화를 예약하기 위해 똑같은 일을하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top