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

2024-04-19 01:30:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近从python2转换到python3.8后遇到了一个问题。你知道吗

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

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

在python2中我曾经导入对数.py进入主.py与

import modules.log

当我在python3里做这个然后打电话给主.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'

Tags: inpyimportlogmodulespackageinitlib
2条回答

您需要指定要打包的源文件的根目录。 我希望你有标准设置.py用你的包定义。你知道吗

查看包目录选项 https://python.readthedocs.io/en/stable/distutils/examples.html

(或者,您可以在ide配置中更改PYTHONPATH并使用包.模块)你知道吗

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

import .modules.log

python2和python3之间的import行为发生了巨大的变化。参考The Conservative Python 3 Porting Guide: Importing

出于本地开发的目的,有一个很好的选项可以将包安装为符号链接

pip install -e ./  user

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

相关问题 更多 >