【问题标题】:Python GUI entry point not working on Bash for WindowsPython GUI 入口点不适用于 Bash for Windows
【发布时间】:2021-05-14 04:09:07
【问题描述】:

我有一个 Python GUI 应用程序(使用 PyQt5 或 PySide2),我想从命令 mypackage 开始。因此,我在setup.cfg 中添加了以下部分:

[options.entry_points]
gui_scripts =
    mypackage = mypackage:main

在 Linux 和 macOS 上,使用 pip 安装软件包成功创建了一个启动应用程序的 mypackage 命令。但是,在 Windows 上,我在 Git Bash 终端中输入 mypackage 后收到一条错误消息:弹出一个标题为“启动器中的致命错误”的对话框,显示“stderr 复制失败”。请注意,当我使用命令提示符 (cmd.exe) 或 Power Shell (powershell.exe) 时,一切正常。

相关包结构:

mypackage/
    mypackage/
        __init__.py
        __main__.py
    pyproject.toml
    setup.cfg

__init__.py:

import sys
from PySide2.QtCore import Qt
from PySide2.QtWidgets import QApplication, QLabel

                                           
def main():
    app = QApplication(sys.argv)
    label = QLabel("Hello World", alignment=Qt.AlignCenter)
    label.show()
    sys.exit(app.exec_())

__main__.py:

from . import main


if __name__ == "__main__":
    main()

pyproject.toml:

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"

setup.cfg:

[metadata]
name = mypackage
version = 0.0.1

[options]
packages = mypackage

[options.entry_points]
gui_scripts =
    mypackage = mypackage:main

重现步骤:

  1. 安装 Python(来自 https://www.python.org/ 的 3.9.8),然后安装 pip install PySide2
  2. 在 Windows 上打开 Git Bash 并切换到根项目文件夹 mypackage
  3. pip install .
  4. 输入mypackage - 弹出错误对话框

同样,如果我在第 3 步中使用命令提示符或 Power Shell,一切正常!

所有文件都在这个 repo 中可用:https://github.com/cbrnr/stderr-duplication

【问题讨论】:

    标签: python windows git-bash setuptools pyside2


    【解决方案1】:

    我最近遇到了同样的问题,并意识到这是因为我没有在我的 PyQt 应用程序中定义main()。从大量的 SO 帖子和 PyQt 教程来看,定义 main() 似乎不是一个约定(我很想知道为什么会这样)。为了解决这个问题,我做了一些简单的重组:

    if __name__ == '__main__':
        app = QApplication(sys.argv)
        w = MainWindow()
        w.show()
        app.exec_()
    

    重组

    def main():
        app = QApplication(sys.argv)
        w = MainWindow()
        w.show()
        app.exec_()
    
    if __name__ == '__main__':
        main()
    

    这允许我使用setup.py 中的入口点

    entry_points={
            'console_scripts':[
                'my_gui=my_gui:main',
                ]}
    

    【讨论】:

    • 感谢分享,但我不认为这是问题所在。我已经有一个main() function,而'mnelab=mnelab.__main__:main' 的值正是这个意思:mnelab.__main__ 模块中的main() 函数。
    • 没问题,对不起,它没有更多用处。我知道这些调用应该引用相同的值,但无论出于何种原因,我都无法让我的入口点与__main__ 一起工作。我不知道这是语法问题(- 等其他字符也可能很棘手),还是我的代码特定的东西。
    • 我认为您需要提供 any 函数名称,它会起作用。
    • 我将main() 函数从__main__.py 移到__init__.py,现在gui_scripts 入口点甚至可以在Windows 上工作(有关详细信息,请参阅我在github.com/cbrnr/mnelab/pull/224 中的更改)。虽然不知道为什么会这样,但显然mnelab:main 有效,mnelab.__main__.main 无效。
    • 实际上,不用管我之前的评论,gui_scripts 入口点仍然无法在 Windows 上运行。我仍然收到“stderr duplication failed”错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2019-08-31
    相关资源
    最近更新 更多