首页 > 解决方案 > 这个 Python3 模块布局和导入方法在哪里定义?

问题描述

具有以下模块布局:

/path/in/pythonpath/
  mymodule/
    __init__.py
    _mymodule-cpython-37m-darwin.so

在 Python 2.7 中,__init__.py 可以导入 .so,如下所示:

import _mymodule

但是在 Python 3.7 中,我发现 _mymodule 没有找到,除非我将 mymodule 目录添加到 PYTHONPATH:

PYTHONPATH=/path/in/pythonpath:/path/in/pythonpath/mymodule

我发现在系统上安装的 typed_ast 模块中使用了这种方法:

...site-packages/typed_ast/
  __init__.py
  ast3.py
  _ast3.cpython-37m-darwin.so

其中 ast3.py 导入 _ast3 如下:

from typed_ast import _ast3
from typed_ast._ast3 import *

使用 mymodule 遵循此模型也可以在无需修改 PYTHONPATH 的情况下工作:

from mymodule import _mymodule
from mymodule._mymodule import *

我的问题是关于发生了什么变化以及对“mymodule”做什么是正确的——这在哪里定义?我没有发现 PEP 或 Python 文档中明确涵盖了这一点。我怀疑它隐含在某些模块文档中,我错过了。

标签: pythonpython-3.xmodule

解决方案


最初的问题陈述不正确。

在 Python 2.7 中,我使用的模块有一个 Python27 目录,其中包含 _mymodule.so:

Python27/
    _mymodule.so

它明确地将 Python27 添加到路径中。因此 Python 3 找不到该模块也就不足为奇了,因为子目录已被删除,并且版本控制命名方案已应用于 .so 文件。

至于两个import语句。两者都不是必需的,除非您希望能够直接访问 _mymodule 函数以及以 _mymodule 为前缀。这通常是出于遗留原因而完成的。

我的问题的答案是:你问错了问题,因为你错误地描述了问题,你想要的是:

from mymodule._mymodule import *

推荐阅读