0

我试图理解 Python 中的导入逻辑。

如果您将教程作为参考,我认为您将无法做到,例如:

from sound.effects import echo

至少,不是来自包装内。

但是,Suds(我感兴趣的一个包)在这里做了类似的事情

suds/suds/builder.py 的片段:

from logging import getLogger
from suds import * 
from suds.sudsobject import Factory
..

文件夹结构:

suds/
    ...no_package_init_file_here...
    suds/
        __init__.py
        builder.py
        sudsobject.py
        ...
       

这如何以及为什么会起作用?

我认为在包中使用容器包名称是一种“不允许”。根据经验。

现在,我能想到一件事:suds 会将自己添加到 PYTHONPATH 中,从而可以访问每个级别。是这个原因吗?

而且,你们认为 Suds 在这里有一个聪明的解决方案吗?还是有点hacky?

提前致谢。

4

2 回答 2

1

两种解决方案都受支持。从一个包中,您可以使用:

from mypackage import mymodule

或者

import mymodule

如果您只想从模块中导入单个类

from mypackage import mymodule.myclass

或者

import mymodule.myclass
于 2013-07-10T18:57:33.530 回答
0

听起来像pythonpath ..

经过一番研究,我发现这一切都取决于 PYTHONPATH 或sys.path. 因此,当from sound.effects import echo在. 只有当它位于存在于.soundsoundsys.pathsoundsys.path

相对于执行的脚本

当从可以找到声音包的目录调用执行的脚本(.py 文件或解释器)时,不会引发错误。这是因为该目录是sys.path列表中的第一个元素。但是,当执行的脚本在包本身内时,它不会找到sound,因此ImportError: No module named sound会引发 a。当然,除非sound包含在另一个级别sys.path(例如在 中/usr/lib/python2.6/dist-packages)。

关于泡沫

现在,因为suds这个导入语句是正确的。那是因为suds包存在于 PYTHONPATH ( sys.path) 中。这样,from suds.sudsobject import Factory调用 PYTHONPATH(dist-packages)中的 suds 版本。

额外

就我而言,我想修改suds源代码,因此我将整个目录的副本放在我的 lib:my_package/lib/suds/中。然而,调用脚本 (.py) 无法找到suds,因为它太深了 1 级。然后引发了导入错误,因为无法正确加载 suds

当您不希望suds进入/退出时,dist-packages您可以sys.path手动将其添加到:

import sys, os
suds_parent = os.path.join(os.path.dirname(__file__), 'lib')
if suds_parent not in sys.path:
    sys.path.append(suds_parent)
于 2013-07-11T13:42:42.707 回答