저는 일정 시간 동안 다른 여러 Python 프로그램을 연 다음 닫는 프로그램을 Raspberry Pi에서 실행하고 있습니다. 뭐가 문제 야:
- Python 3 IDE, Thonny Python 또는 기타 IDE에서 기본 프로그램을 실행하면 모든 것이 잘 작동하고 모든 프로그램이 예상대로 열리고 닫힙니다.
- Python 3 IDE, Thonny Python 또는 기타 IDE에서 기본 프로그램을 실행하지만 다른 터미널 창이 열려 있는 경우(아무 것도 실행하지 않고 단지 열려 있고 유휴 상태일 뿐임) 모든 프로그램이 열리지만 닫을 수는 없습니다. 나중에 .
- 터미널 창에서 기본 프로그램을 실행하면 모든 프로그램이 열리지만 나중에는 닫을 수 없습니다.
코드 예시
while True:
proc = subprocess.Popen(['lxterminal', '-e', ' test_aa.py'])
proc_bb = subprocess.Popen(['lxterminal', '-e', 'test_bb.py'])
time.sleep(5)
proc.terminate()
proc_bb.kill()
time.sleep(200)
다른 예시
while True:
print("opening")
proc = subprocess.Popen(['lxterminal', '-e', ' test_aa.py'])
c = proc.pid
print(c)
time.sleep(3)
os.kill(c, signal.SIGTERM)
time.sleep(700)
이는 다른 터미널 창을 수동으로 열지 않고도 작동합니다.
프로그램을 시작하기 위해 나는 또한 Popen과 os.system의 다양한 변형을 시도했고 매번 잘 작동했습니다.
종료/종료하려면 os.system, os.kill(pid, signal.SIGTERM), os.kill(pid, signal.SIGINT) 등을 시도했습니다. -9 PID, subprocess.Popen으로 종료한 다음 종료() 또는 종료()
업데이트 1
위의 질문에 따르면 부분적으로 답변할 수 있을 것 같지만 동시에 더 많은 질문이 제기됩니다.
다음 코드를 고려해보세요:
while True:
print("opening")
proc = subprocess.Popen(['lxterminal', '-e', ' test_aa.py'])
c = proc.pid
print(c)
time.sleep(3)
os.kill(c, signal.SIGTERM)
time.sleep(700)
사용
ps aux
나는 찾았다
['lxterminal']
그리고
['test_aa.py']
다른 PID 번호로 실행 중입니다. 그래서
c = proc.pid
['lxterminal']을 종료할 수 없는 이유를 설명할 수 있는 ['test_aa.py']의 pid를 제공합니다.
내가 맞나요?
다른 터미널 창에서 Python 프로그램을 시작하지만 동일한 PID 번호를 갖는지 확인하는 다른 옵션은 무엇입니까?
업데이트 2
나는 pid 번호로 새 터미널 창을 실행하고 있습니다. 그래서 정렬되었습니다. 또한 좀비 프로세스가 실행되고 있지 않은지 확인하기 위해 코드를 사용합니다.
stdout, stderr = proc.communicate()
proc.wait()
작동하며 좀비 프로세스가 실행되고 있지 않습니다.
그러나 불행하게도 같은 이야기가 다시 발생합니다. 터미널 창을 열고 프로그램을 실행하면 프로그램에서 시작한 터미널이 종료되지 않습니다. 나는 두 가지 다른 라즈베리 파이를 시험해 보았습니다. 같은.
다른 터미널 창을 열면 갑자기 프로그램이 닫히지 않는 이유는 무엇입니까?
최종 업데이트
내 질문에 부분적으로 답변했습니다.
일부 터미널 창이 열려 있는 경우 내 프로그램이 다른 프로그램을 종료하지 않는 이유를 여전히 이해하지 못하지만 해결 방법을 찾았습니다. 바꾸다
lxterminal,
나는 사용하고있다
uxterm #uterm can also be used
내 코드는 이제 다음과 같습니다.
proc = subprocess.Popen([‘uxterm’, ‘-e’, ‘test_aa.py’], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid)
완벽하게 작동합니다. 터미널 창에서 다른 프로그램을 실행할 수 있고, 재부팅한 후 .sh 파일을 사용하여 모든 것을 다시 활성화할 수 있습니다.
이것이 바로 제가 찾던 것입니다 :-)
도움을 주셔서 감사합니다.