从 __init__.py 目录导入本地 python 模块

Importing local python module from directory with __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 包,但在我这边它识别出来了吗?很困惑。我对这个领域比较陌生,所以欢迎任何建议!

导入模块时,python 在 sys.path 中指定的目录中执行查找以查找 module.pymodule/__init__.py 文件。

默认启动后sys.path包含:

  • 当前目录(""
  • PYTHONPATH
  • 指定的目录
  • Python 内置路径
  • PYTHONUSERBASE
  • 指定的本地站点包
  • 系统站点包(或 virtualenv 站点包)

您无法导入 osprojmine,因为 root 目录不满足这些条件中的任何一个。

第一次你可以:

  • 运行 python 来自 root 目录
  • 永久或临时将 root 目录添加到您的 PYTHONPATH
    env PYTHONPATH=/path/to/root:${PYTHONPATH} python ...
    

但这是穷人的解决方案,最好是用 setuptools and install it (evently in development mode) either in local site-pakage, named user scheme 或 virtualenv site-package 打包你的项目。

同事(和你)应该运行代码为:

$ cd root
$ python -m mycode

这样绝对导入就解决了