【问题标题】:Simple Python Package Structure Not Working简单的 Python 包结构不起作用
【发布时间】:2015-11-29 17:02:45
【问题描述】:

我的环境是python2.7的virtualenv

我创建了一个非常简单的 python 包来尝试识别问题。我有一个包,其中包含所有带有__init__.py 文件的子包,但是在构建之后我无法从子包中导入文件。除了我要导入的文件外,所有文件都是空的,它只包含一个虚拟类。

class LazyUrl(object): pass.

包结构

- setup.py
- sloth_toolkit/
        - __init__.py
        - webtools/
                - __init__.py
                - urls.py
        - systools/
                - __init__.py
        - utils/
                - __init__.py

setup.py

from setuptools import setup

setup(
    name = 'sloth-toolkit',
    packages = ['sloth_toolkit'],
    version = '0.0.01',
    author = 'crispycret',

    description='Contains lazy rich objects, such as the LazyUrl..',
)

urls.py

class LazyUrl(object):
    pass

然后我安装包,将终端移动到用户根目录以避免导入源,然后运行ipython。我导入包没有问题,然后我尝试导入/访问虚拟类LazyUrl,这就是它中断的地方。

ipython 会话

In [1]: import sloth_toolkit

In [2]: sloth_toolkit.webtools.urls.LazyUrl()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-2-edc6d4b8bbf3> in <module>()
----> 1 sloth_toolkit.webtools.urls.LazyUrl()

AttributeError: 'module' object has no attribute 'webtools'

In [3]: from sloth_toolkit.webtools import urls
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-3-f6b31fa7f72c> in <module>()
----> 1 from sloth_toolkit.webtools import urls

ImportError: No module named webtools

这让我发疯了。我相信问题是我不知道的环境。

这是我正在从事的项目https://github.com/crispycret/sloth-toolkit

在 virtualenv 中安装并导入包后,我在将 LazyUrl 类导入包主 __init__.py 文件时收到此错误。

真正的包错误

In [1]: import sloth_toolkit
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-70e153ca48f0> in <module>()
----> 1 import sloth_toolkit

/home/crispycret/Documents/sloth-testing/lib/python2.7/site-packages/sloth_toolkit-0.0.11-py2.7.egg/sloth_toolkit/__init__.py in <module>()
      3 # from . import utilities
      4 
----> 5 from .webtools.urls import LazyUrl
      6 from .systools.paths import LazyPath
      7 

ImportError: No module named webtools.urls

【问题讨论】:

  • 如果您查看安装包的目录,它是否与该包布局匹配?可能是某些setup.py 错误导致它无法正确安装。
  • 我想是的。我已经更新了问题,包括setup.py 文件

标签: python import virtualenv packages importerror


【解决方案1】:

快速总结

问题:__init__.py 文件不应为空。

解决方案:__init__.py 文件导入您希望包中包含的所有函数、类,甚至是子模块 (!)。

sloth_toolkit/__init__.py

from .webtools import *
from .systools import *
from .utils import *

sloth_toolkit/webtools/__init__.py

from .urls import *  # OR from .urls import LazyUrl

我希望这会有所帮助!我添加了这个答案,因为这是 python 初学者的常见问题。 这仍然是它在 Python 3.X 中的工作方式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多