如何解决使用 __init__.py
我一直在开发一个需要编辑和使用开源项目的项目,我们称之为 osproj。我将包含已编辑脚本的文件夹重命名为 osprojmine。
这是一个示例目录结构:
root/
mycode.py
osprojmine/
__init__.py
foo.py
bar.py
在 mycode.py 中有导入语句
import osprojmine as osproj
我已经能够在 mycode.py 中使用 osproj.module()
和 osproj.class()
,没有任何问题,并且一切都在我的端运行顺利。
当我将文件发送给我的同事时,问题就出现了。
他得到一个ModuleNotFoundError: No module named 'osprojmine'
我使用的是 python 3.8.5。他在 3.9.6 上并尝试降级。
似乎他的 python 解释器没有将 osprojmine 识别为 python 包,但在我这边呢?很困惑。我对这个领域比较陌生,所以欢迎提出任何建议!
解决方法
同事(以及您)应该将代码运行为:
$ cd root
$ python -m mycode
这样就解决了绝对导入
,导入模块时,python 在 sys.path
中指定的目录中执行查找以查找 module.py
或 module/__init__.py
文件。
默认情况下,启动后 sys.path
包含:
- 当前目录 (
""
) -
PYTHONPATH
指定的目录 - Python 内置路径
- 由
PYTHONUSERBASE
指定的本地站点包 - 系统站点包(或 virtualenv 站点包)
您无法导入 osprojmine
,因为 root
目录不满足任何这些条件。
第一次你可以:
- 从
root
目录运行 python - 将
root
目录永久或临时添加到您的PYTHONPATH
:env PYTHONPATH=/path/to/root:${PYTHONPATH} python ...
但这是穷人的解决方案,最好是用 setuptools 打包您的项目并在本地站点包中安装它(最终在 development mode 中),命名为 user scheme,或在 virtualenv 中网站包。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。