【问题标题】:Importing local python module from directory with __init__.py使用 __init__.py 从目录导入本地 python 模块
【发布时间】:2021-09-13 16:31:22
【问题描述】:

我一直在做一个需要编辑和使用开源项目的项目,我们称之为 osproj。我将包含已编辑脚本的文件夹重命名为 osprojmine。

这是一个示例目录结构:

root/  
    mycode.py  
    osprojmine/  
        __init__.py  
        foo.py  
        bar.py  

在 mycode.py 我有 import 语句

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 package relative-import


    【解决方案1】:

    同事(以及您)应该将代码运行为:

    $ cd root
    $ python -m mycode
    

    这样绝对导入就解决了

    【讨论】:

      【解决方案2】:

      当你导入一个模块时,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 打包您的项目,然后将其安装在本地站点包(名为 user scheme)或 virtualenv 站点包中(最终在 development mode 中)。

      【讨论】:

        猜你喜欢
        • 2013-04-21
        • 2018-10-09
        • 2015-07-30
        • 2016-06-14
        • 1970-01-01
        • 2021-11-08
        • 1970-01-01
        • 1970-01-01
        • 2018-10-27
        相关资源
        最近更新 更多