重命名模块后出现“没有名为'core'的模块”错误

0 投票
2 回答
4280 浏览
提问于 2025-04-18 02:45

我有以下的文件夹结构:

src/
  |- setup.py
  |- prettylogger
    |- __init__.py
    |- core.py
  |- transgression
    |- __init__.py
    |- core.py

我遇到的问题是,它的设置不太正确。我想要的是安装两个包——prettyloggertransgression,这样prettylogger就可以独立于transgression被导入,反之亦然,使用的代码是from prettylogger.core import PrettyLogger(类PrettyLoggerprettylogger/core.py文件里)。

我尝试过根据这篇帖子来写setup.py文件,但效果不太好。它似乎在我的Mac上把prettyloggertransgression安装到了/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 个回答

0

名为 __init__.py 的文件用于标记磁盘上的目录为 Python 包目录。

如果你删除了 __init__.py 文件,Python 就不会再在那个目录里寻找子模块了,所以尝试导入这个模块时会失败。

如果你有很多文件夹,就在每个文件夹里创建一个空的 __init__.py 文件。例如:

src/
  |- __init__.py
  |- setup.py
  |- prettylogger
    |- __init__.py
    |- core.py
  |- transgression
    |- __init__.py
    |- core.py
3

你的包目录里有一个 __init__.py 文件吗?Python 需要这个文件来识别这个目录及其内容是一个包(不过我觉得在更新的 Python 3.x 版本中可能有所改变)。

这个 __init__.py 文件可以是空的,不需要任何额外的内容。

撰写回答