仅当从已安装的包调用时,Python 从子文件夹导入才会失败

标签 python python-3.x importerror

我最近从 python2 切换到 python3.8 后遇到了问题。

这是我的文件设置(删节):

package/
       __init__.py
       main.py
       modules/
              __init__.py
              log.py

在 python2 中,我曾经将 log.py 导入到 main.py 中

import modules.log

当我在 python3 中执行此操作并从控制台调用 main.py 时

python /path/to/package/main.py

一切正常。

然后我从中创建一个 python 包并将其安装在我的 archlinux/raspberrypi 上,并通过控制台调用脚本

 /usr/bin/package

它告诉我

$ package
Traceback (most recent call last):
  File "/usr/bin/package", line 11, in <module>
    load_entry_point('package==3.1.1', 'console_scripts', 'package')()
  File "/usr/lib/python3.8/site-packages/pkg_resources/__init__.py", line 489, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2852, in load_entry_point
    return ep.load()
  File "/usr/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2443, in load
    return self.resolve()
  File "/usr/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2449, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/usr/lib/python3.8/site-packages/package/main.py", line 5, in <module>
    import modules.log
ModuleNotFoundError: No module named 'modules'

知道为什么它不起作用吗?我想一旦作为包安装,它就会出现在不同的地方。

提前致谢

编辑:当我将导入更改为

时,我可以成功运行该包
from package.modules import log

但是只有作为软件包安装时它才有效。从我的 IDE(它没有作为包安装)运行它自然会导致错误

ModuleNotFoundError: No module named 'package'

最佳答案

您可以对 intra-package references 使用相对导入,例如对于 main.py 引用 log.py 来说,它将是:

import .modules.log

Python 2 和 3 之间的导入行为发生了巨大变化。请参阅The Conservative Python 3 Porting Guide: Importing

出于本地开发目的,有一个不错的选项可以将包安装为符号链接(symbolic link)

pip install -e ./ --user

在这种情况下,它将使您安装的软件包保持最新的源代码,同时您将能够像往常一样使用此软件包。

关于仅当从已安装的包调用时,Python 从子文件夹导入才会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58921395/

相关文章:

python - 在 SciPy 中,什么是 'slinear' 插值?

python - 我的主要功能是无限循环重复,我不知道为什么

java - 在 jython 中使用枚举

python - 如何根据 Pandas 数据框的值沿行计数?

Python 3.6.8 - 绝地武士 - 导入错误 : cannot import name 'traverse_parents'

python - Google Charts API 无法在 pythonanywhere.com 上上传的 web2py 应用程序上运行

python - Mac 上 Python 中的 MIDI 程序没有声音

python-3.x - Mypy 迭代器和生成器有什么区别?

python - 导入 mlxtend python 的问题

python - 使用 Python setuptools.command.sdist 导入错误