2016-08-25 46 views
1

所以我想通过小脚本和web开发移动到桌面应用程序,扩大我的Python的知识和技能,和我有一些无法理解的切入点与setup.py,他们对进口的影响。我也没有深入了解导入如何在Python中工作,这没有帮助。绝对进口和入口点

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

看它的代码,似乎所有进口其自己的模块是绝对的,例如:

# 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编写的任何其它大型桌面应用程序的,我可以看看为例子,我喜欢它,如果你告诉我吧:)

干杯

回答

0

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

在入口点,我们有这样一个

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

它正在访问的顶级包名,洪水线。在那之内,它进入了ui模块,并且里面的一个文件叫做console.py。在那个文件中是'start'的定义。安装后,当从命令行调用时,您将访问已安装的python模块,并最终访问您要运行的函数。

在自己,我们看到这样的行的文件。

from deluge.core.eventmanager import EventManager 

它进入已安装的软件包洪流。进入模块'核心',它会找到一个名为eventmanager.py的文件。在那个文件中,我猜想有一个叫做EventManager的类。

在每一种情况下,你正在访问安装的软件包,并提供有关模块和子模块,然后最后你想要的任何实际对象函数类的信息。