我的环境是使用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
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..',
)
class LazyUrl(object):
pass
然后我安装软件包,将终端移动到用户根目录以避免导入源,然后运行ipython
。我导入包没有问题,然后我尝试导入/访问虚拟类LazyUrl
,这是它破坏的地方。
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
答案 0 :(得分: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中的工作方式。