一些背景信息:我正在为新手用户创建一个小型 Python 编程实验室。我希望他们使用 Python 的 IDLE 编辑器(您将其启动为python -m idlelib
),但由于他们可能不习惯使用终端,所以我希望他们可以在 nautilus(Gnome 的文件管理器)中单击一些可以启动 IDLE 的内容。更准确地说,我想使用 Python 虚拟环境启动 IDLE,因此命令变为.venv/bin/python -m idlelib
idle
这是我创建、命名并标记为可执行文件 ( ) 的文件chmod u+x
:
#!/usr/bin/env bash
.venv/bin/python -m idlelib
如果你双击它并选择“运行”,你会得到 IDLE,一切都很好。但是,当您双击它时,您会看到几个按钮,一个是“运行”,另一个是“在终端中运行”。我想确保用户无论单击什么按钮都有相同的体验。
使用上面的脚本,如果您选择“在终端中运行”,您将同时拥有 IDLE 和弹出的终端。这可能会让用户感到困惑,特别是因为关闭终端会终止 IDLE。在命令之后添加&
会关闭终端,但随后 IDLE 也会关闭,因为它的“父级”(终端)已终止。
所以我听说nohup
这setsid
似乎就是我所需要的,但奇怪的事情发生了。这是一个脚本(或多或少)可以实现我想要的功能:
#!/usr/bin/env bash
setsid .venv/bin/python -m idlelib &
sleep 1
当您单击此脚本并选择“在终端中运行”时,会出现一个终端,然后出现 IDLE,然后终端消失,但 IDLE 保留。
但请注意sleep 1
最后的 :如果删除它,终端只会出现几分之一秒,并且 IDLE 永远不会出现。setsid
和都会发生这种情况nohup
。
我的问题是:为什么这是sleep 1
必要的?
我的猜测是 IDLE 需要一些时间才能启动,并且在终端完全启动之前它无法“幸存”。但这很奇怪,我希望启动的程序setsid
是即刻独立于启动它的进程。
答案1
尝试使用-w选项,因此它将等待完成然后返回其退出代码:
#!/usr/bin/env bash
setsid -w .venv/bin/python -m idlelib