重命名模块后出现“没有名为'core'的模块”错误
我有以下的文件夹结构:
src/
|- setup.py
|- prettylogger
|- __init__.py
|- core.py
|- transgression
|- __init__.py
|- core.py
我遇到的问题是,它的设置不太正确。我想要的是安装两个包——prettylogger和transgression,这样prettylogger就可以独立于transgression被导入,反之亦然,使用的代码是from prettylogger.core import PrettyLogger
(类PrettyLogger
在prettylogger/core.py
文件里)。
我尝试过根据这篇帖子来写setup.py文件,但效果不太好。它似乎在我的Mac上把prettylogger和transgression安装到了/Library/Python/2.7/site-packages
目录下,然而当我在命令行输入transgression
时,出现了:
File "/usr/local/bin/transgression", line 8, in <module>
load_entry_point('transgression==0.0.1', 'console_scripts', 'transgression')()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 318, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 2221, in load_entry_point
return ep.load()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 1954, in load
entry = __import__(self.module_name, globals(),globals(), ['__name__'])
File "build/bdist.macosx-10.9-intel/egg/transgression/core.py", line 2, in <module>
File "build/bdist.macosx-10.9-intel/egg/configurator/core.py", line 16, in <module>
ImportError: No module named core
我在transgression/transgression-test.py里有一个测试套件,当我切换到那个目录并运行它时,出现了:
Traceback (most recent call last):
File "build/bdist.macosx-10.9-intel/egg/transgression/core.py", line 16, in <module>
from prettylogger.core import PrettyLogger
ImportError: No module named core
所以,看起来它找不到这个模块。我刚把模块的名字从prettylogger.py改成了core.py,因为我想用from prettylogger.core import PrettyLogger
来导入,而不是from prettylogger.prettylogger import PrettyLogger
。
Setup.py:
from setuptools import setup
import os
setup(name='prettylogger',
version='0.0.1',
description='A logging utility package designed for command line use',
py_modules=['prettylogger.core'],
# Note: I also have tried packages=['prettylogger'], here
install_requires=['ansicolors']
)
setup(name='transgression',
version='0.0.1',
description='Generic binary regression finding utility',
packages=['transgression'],
entry_points={ 'console_scripts': [
'transgression = transgression.core:main'] },
install_requires=['prettylogger']
)
2 个回答
名为 __init__.py
的文件用于标记磁盘上的目录为 Python 包目录。
如果你删除了 __init__.py
文件,Python 就不会再在那个目录里寻找子模块了,所以尝试导入这个模块时会失败。
如果你有很多文件夹,就在每个文件夹里创建一个空的 __init__.py
文件。例如:
src/
|- __init__.py
|- setup.py
|- prettylogger
|- __init__.py
|- core.py
|- transgression
|- __init__.py
|- core.py
你的包目录里有一个 __init__.py
文件吗?Python 需要这个文件来识别这个目录及其内容是一个包(不过我觉得在更新的 Python 3.x 版本中可能有所改变)。
这个 __init__.py
文件可以是空的,不需要任何额外的内容。