使用 __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.pymodule/__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 中网站包。