如何在不阻塞的情况下从 shell 启动 QApplication?

How to start a QApplication from shell without blocking it?

我有一个简单的 Qt5 应用程序,可以作为 pip 包安装。 该包有一个入口点,因此我可以通过命令提示符启动应用程序。 调用的函数如下所示:

def start_app():
    app = QtWidgets.QApplication(sys.argv)

    win = MainWindow()
    win.show()

    app.exec()
    sys.exit()

和 MainWindow(最小工作示例):

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

问题 是现在命令提示符是主要应用程序,所以如果我关闭提示符,python 应用程序也会关闭。此外,命令提示符被“阻止”,因此无法输入其他命令。

我的目标 是仅使用命令提示符启动应用程序并在之后关闭它或将其用于其他命令。我们可以以 Spyder 应用程序为例,它可以通过命令 spyder 启动,它不会阻止命令提示符。遗憾的是,我无法利用我目前的知识对 spyder 代码进行逆向工程。

编辑 1:澄清一下:我不希望任何 shell 可见,只希望 Qt GUI 可见。我还想实现在没有任何命令行参数的情况下使用单个命令(如 spyder)打开应用程序,就像你在评论中看到的那样。

编辑 2: 目标 OS 是 Windows。

包的设置方式如下,因此启动应用程序的命令为start_app

setup(
    ...
    entry_points = {
        'console_scripts': ['start_app = package.module:start_app']
    },
    ...
)

我试过 使用 QThreads 并查找了类似的问题,但无法得到它 运行,甚至没有关闭。

感谢您的帮助。

如果您在 bash shell 上,您可以使用 CTRL+Z 将 运行ning 进程发送到后台。或者 运行 您的应用程序在命令末尾带有尾随 & 以从头开始在后台启动进程。

解决方案是使用 gui_scripts 作为入口点,而不是 console_scripts。 应该更仔细地阅读文档:Entry points specification