Где определено расположение модуля Python3 и метод импорта? - PullRequest
0 голосов
/ 19 октября 2019

При следующей компоновке модуля:

/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. Я подозреваю, что это подразумевается в некоторых документах модуля, и я пропустил это.

1 Ответ

0 голосов
/ 21 октября 2019

Исходная формулировка проблемы была неправильной.

В Python 2.7 модуль, с которым я работал, имел каталог Python27 с _mymodule.so в нем:

Python27/
    _mymodule.so

И он был явно добавленПитон27 к пути. Поэтому неудивительно, что Python 3 не смог найти модуль, поскольку подкаталог был удален, а схема именования версий была применена к файлу .so.

Что касается двух операторов импорта. И то, и другое не обязательно, если только вы не хотите иметь доступ к функциям _mymodule напрямую, а также с префиксом _mymodule. Обычно это делается по старым причинам.

Ответ на мой вопрос таков: вы задали неправильный вопрос, потому что ошибочно охарактеризовали проблему и, что вы хотите:

from mymodule._mymodule import *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...