绝对导入和入口点

时间:2016-08-25 01:01:11

标签: python

所以我试图通过从小脚本和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的答案,这通常是不可能的。要使用绝对导入,必须从项目根目录中的文件启动程序。

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

那么如何在模块中更深入地了解Python程序的入口点,但是使用项目根目录中的绝对导入? Deluge似乎已经做到了,但我不知道怎么做,我想在我的项目中这样做。

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

干杯

1 个答案:

答案 0 :(得分:0)

所有这些实际上都在做同样的事情。

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

vector

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

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

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

它进入已安装的软件包泛滥。进入模块'core',它将找到一个名为eventmanager.py的文件。在该文件中,我猜有一个名为EventManager的类。

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