Python 仅当从已安装的包中调用时,从子文件夹导入才会失败
Python import from subfolder fails only when called from installed package
我最近从 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'
您需要指定要打包实用程序的源文件的根目录。
我希望你有标准的 setup.py 和你的包定义。
查看package_dir选项
https://python.readthedocs.io/en/stable/distutils/examples.html
(或者您可以在 ide 配置中更改 PYTHONPATH 并使用 package.modules)
您可以对 intra-package references 使用相对导入,例如对于 main.py
引用 log.py
它将是:
import .modules.log
import
行为在 Python 2 和 3 之间发生了巨大变化。请参阅 The Conservative Python 3 Porting Guide: Importing
为了本地开发目的,有一个很好的选项可以将包安装为符号链接
pip install -e ./ --user
在这种情况下,它将使您安装的包与源保持最新,而您将能够像往常一样使用该包。
我最近从 python2 切换到 python3.8.
后遇到问题这是我的文件设置(删节):
package/
__init__.py
main.py
modules/
__init__.py
log.py
在 python2 中,我曾经使用
将 log.py 导入 main.pyimport modules.log
当我在 python3 中执行此操作并使用
从控制台调用 main.pypython /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'
您需要指定要打包实用程序的源文件的根目录。 我希望你有标准的 setup.py 和你的包定义。
查看package_dir选项 https://python.readthedocs.io/en/stable/distutils/examples.html
(或者您可以在 ide 配置中更改 PYTHONPATH 并使用 package.modules)
您可以对 intra-package references 使用相对导入,例如对于 main.py
引用 log.py
它将是:
import .modules.log
import
行为在 Python 2 和 3 之间发生了巨大变化。请参阅 The Conservative Python 3 Porting Guide: Importing
为了本地开发目的,有一个很好的选项可以将包安装为符号链接
pip install -e ./ --user
在这种情况下,它将使您安装的包与源保持最新,而您将能够像往常一样使用该包。