绝对导入和入口点

2024-06-25 23:08:55 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我试图通过从小型脚本和web开发转移到桌面应用程序来扩展Python的知识和技能,并且在理解setup.py的入口点及其对导入的影响方面遇到了一些困难。我对导入在Python中的工作方式也没有深入的了解,这是没有帮助的

我的困惑来自于看一个大型桌面应用程序的示例代码,特别是Deluge,一个用Python编写的Torrent应用程序

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

# 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的答案,这通常是不可能的。要使用绝对导入,程序必须从项目根目录中的文件启动

就我的理解而言,flouge必须以某种方式改变它的PYTHONPATH,比如用sys.path,然而搜索代码只能找到它的一个实例,但它似乎只与文档相关,而不是实际的软件代码

那么,如何在模块内部更深层地为Python程序设置入口点,而使用从项目根目录的绝对导入呢?洪水似乎已经做到了,但我不知道如何,我想这样做,在我的项目

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

干杯


Tags: 项目代码pycore程序web应用程序ui
1条回答
网友
1楼 · 发布于 2024-06-25 23:08:55

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

在入口点我们有一条像这样的线

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

它正在访问顶级包名flouge。在其中,它进入ui模块,其中有一个名为console.py的文件。在该文件中是“start”的定义。安装之后,当从命令行调用时,您将访问已安装的python模块,以及最终要运行的函数

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

from deluge.core.eventmanager import EventManager

它进入安装包洪水。进入模块“core”,它将找到一个名为eventmanager.py的文件。在这个文件中,我猜有一个类叫做EventManager

在每种情况下,您都要访问已安装的软件包,并提供有关模块和子模块的信息,最后才是实际的对象函数类

相关问题 更多 >