我正在树莓派上运行一个程序,它会在一定时间内打开其他几个Python程序,然后关闭它们。怎么了:
- 如果我从 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
给我 ['test_aa.py'] 的 pid,这可能可以解释为什么我无法终止 ['lxterminal']
我这样说对吗?
在另一个终端窗口中启动 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 文件使所有程序再次恢复活力。
这正是我一直在寻找的:-)
谢谢大家的帮助。