【问题标题】:Absolute imports and entrypoints绝对导入和入口点
【发布时间】:2016-08-25 01:01:11
【问题描述】:

因此,我试图通过从小型脚本和 Web 开发转向桌面应用程序来扩展我的 Python 知识和技能,但在理解 setup.py 的入口点以及它们对导入的影响时遇到了一些麻烦。我对 Python 中导入的工作原理也没有深入了解,这无济于事。

我的困惑来自于查看大型桌面应用程序的示例代码,特别是 Deluge,这是一个用 Python 编写的种子下载应用程序。

看它的代码,好像它自己的模块的所有导入都是绝对的,例如:

# deluge/core/core.py
import deluge.common
from deluge.core.eventmanager import EventManager

但有趣的是,setup.py 中定义的所有入口点在程序中也更深:

# setup.py
entry_points = {
    'console_scripts': [
        'deluge-console = deluge.ui.console:start',
        'deluge-web = deluge.ui.web:start',
        'deluged = deluge.core.daemon_entry:start_daemon'
    ],
    'gui_scripts': [
        'deluge = deluge.ui.ui_entry:start_ui',
        'deluge-gtk = deluge.ui.gtkui:start'
    ],
    'deluge.ui': [
        'console = deluge.ui.console:Console',
        'web = deluge.ui.web:Web',
        'gtk = deluge.ui.gtkui:Gtk',
    ],
}

据我所知,根据this SO question 的答案,这通常是不可能的。要使用绝对导入,程序必须从项目根目录中的文件启动。

据我了解,deluge 必须以某种方式更改其 PYTHONPATH,例如使用 sys.path,但是搜索代码只能找到它的一个实例,但它似乎只与文档有关,而不是实际软件代码。

那么,如何在模块的更深处为他们的 Python 程序提供一个入口点,但使用来自项目根目录的绝对导入? Deluge 似乎已经做到了,但我不知道如何,我想在我的项目中这样做。

作为一个附带问题,如果您知道任何其他用 Python 编写的大型桌面应用程序,我可以查看示例,如果您告诉我,我会很高兴的 :)

干杯

【问题讨论】:

    标签: python


    【解决方案1】:

    所有这些实际上都在做完全相同的事情。

    在入口点我们有这样一行

    'deluge-console = deluge.ui.console:start'
    

    它正在访问顶级包名 deluge。在其中,它进入 ui 模块,其中有一个名为 console.py 的文件。在该文件中是“开始”的定义。安装后,从命令行调用时,您将访问已安装的 python 模块,并最终访问您要运行的功能。

    在文件本身中,我们看到这样的行。

    from deluge.core.eventmanager import EventManager
    

    它进入已安装的软件包 deluge。进入模块“核心”,它会找到一个名为 eventmanager.py 的文件。在那个文件中,我猜有一个名为 EventManager 的类。

    在每种情况下,您都在访问已安装的包,并提供有关模块和子模块的信息,最后是实际对象的功能类,无论您想要什么。

    【讨论】:

      猜你喜欢
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 2021-11-24
      • 2022-08-18
      • 1970-01-01
      • 2019-03-30
      相关资源
      最近更新 更多