【问题标题】:Python: Exiting python.exe after Popen?Python:Popen 后退出 python.exe?
【发布时间】:2015-06-18 12:49:02
【问题描述】:

小问题:

我有一个按预期工作的 python 脚本,除非我选择一个菜单选项来打开另一个 python 脚本:

myPath = r"c:\Python27\myScript.py"
cmd = r"c:\Python27\python.exe '{}'".format(myPath)
py_process = Popen(cmd, stdout=PIPE, stdin=PIPE, stderr=STDOUT)

当我运行该 sn-p(在 Windows 中)时,子进程按预期在后台启动,但是当我尝试退出主脚本但让子进程在后台运行时:

raise SystemExit

...一个空窗口“c:\python27\python.exe”仍然存在。我尝试了其他具有类似结果的 EXIT 方法。注意:当我退出主脚本而不运行该 sn-p 时,python 窗口会根据需要消失。

我的目标是在所有情况下退出主脚本后不留下任何痕迹/窗口,但子进程应保持在后台运行。

对实现这个目标有什么建议吗?

谢谢!

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    如果您想先与已启动的进程进行通信,然后让其继续运行,您有以下几种选择:

    • 在您的长时间运行的进程中处理 SIGPIPE,不要死在上面。启动器进程退出后,在没有标准输入的情况下继续运行。
    • 使用参数、环境或临时文件传递您想要的任何内容。
    • 如果您想要双向通信,请考虑使用命名管道 (man mkfifo) 或套接字,或者编写适当的服务器。
    • 在初始双向通信阶段完成后,使长时间运行的进程分叉。

    它不会创建“一个完全独立的进程”(python-daemon 包所做的)。在其他情况下,您应该重定向到 os.devnull 孩子的 stdin/stdout/stderr 以避免等待终端的输入和/或虚假输出

    Source

    【讨论】:

    • 谢谢,umbreon222。父进程不需要与子进程进行任何通信。我确实注意到在任务管理器中手动杀死“conhost.exe”进程确实会删除那个空窗口,并让背景继续运行。
    • Adding:pykill=subprocess.Popen("TASKKILL /IM "+ " conhost.exe" + " /F") 就在“raise SystemExit”杀死空窗口之前,但我觉得有风险它会杀死所有 conhost 进程必须有更好的方法。
    • 不要调用 python.exe 作为你的解释器,试试 pythonw.exe。它是无窗口的 Python 解释器。 (另外,如果你不打算和孩子交流,那就不要用管道钩住它)
    猜你喜欢
    • 2020-05-19
    • 2017-08-02
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2021-06-17
    • 2017-09-04
    • 2014-11-08
    • 2014-10-07
    相关资源
    最近更新 更多