首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绝对导入和入口点

绝对导入和入口点
EN

Stack Overflow用户
提问于 2016-08-25 09:01:11
回答 1查看 80关注 0票数 1

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

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

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

代码语言:javascript
复制
# deluge/core/core.py
import deluge.common
from deluge.core.eventmanager import EventManager

但有趣的是,正如在setup.py中定义的那样,它的所有入口点都位于程序的更深层次:

代码语言:javascript
复制
# 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程序的入口点深入模块内部,而从项目根使用绝对导入呢?洪水似乎已经做到了,但我不知道是如何做到的,我想在我的项目中做到这一点。

顺便提一个问题,如果你知道任何其他用Python编写的大型桌面应用程序,我可以看看这些例子,如果你能告诉我的话我会很高兴的:)

干杯

EN

回答 1

Stack Overflow用户

发布于 2017-03-30 03:13:41

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

在入口点中,我们有一行类似于下面的行

代码语言:javascript
复制
'deluge-console = deluge.ui.console:start'

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

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

代码语言:javascript
复制
from deluge.core.eventmanager import EventManager

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39135145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档