Как python загружает модуль из пути, которого нет в sys.path - PullRequest
1 голос
/ 31 октября 2019

Я отлаживал проблему с импортом Python, из-за которой я не могу правильно загрузить jinja2 во время выполнения своего кода с использованием файла pex.

Установите точку останова в моем коде и оказался в очень интересной ситуации

(Pdb) import jinja2
(Pdb) import jinja2.utils
(Pdb) jinja2.utils
*** AttributeError: 'module' object has no attribute 'utils'
(Pdb) sys.modules.get("jinja2")
<module 'jinja2' from '/home/xxx/.pex/install/Jinja2-2.10.3-py2.py3-none-any.whl.02f611acfe90225e024bd496a640e01844bf5a32/Jinja2-2.10.3-py2.py3-none-any.whl/jinja2/__init__.py'>
(Pdb) sys.modules.get("jinja2.utils")
<module 'jinja2.utils' from '/usr/local/lib/python2.7/dist-packages/jinja2/utils.pyc'>
(Pdb) [i for i in sys.path if "usr/local/lib/python2.7" in i]
[]

До точки останова jinja2 уже был частично загружен, потому что я установил точку останова внутри jinja2's __init__.py, вот трассировка стека:

-> exec code in run_globals
  /home/xxx/.pex/code/e7fe7e585c258eb7224ec5030b9d53b74cdfb06f/application/app.py(2)<module>()
-> from flask import Flask, abort, request
  /home/xxx/.pex/install/Flask-1.0-py2.py3-none-any.whl.abe8dd5f49600e54576b3360b7622e1cc97e86fc/Flask-1.0-py2.py3-none-any.whl/flask/__init__.py(19)<module>()
-> from jinja2 import Markup, escape
> /home/xxx/.pex/install/Jinja2-2.10.3-py2.py3-none-any.whl.02f611acfe90225e024bd496a640e01844bf5a32/Jinja2-2.10.3-py2.py3-none-any.whl/jinja2/__init__.py(58)<module>()
-> print("aaaaaaaaa")

Вопросы:

  1. Как python даже загружает jinja2.utils из /usr/local/lib/python2.7/dist-packages, когда он даже не является частью sys.path?
  2. Почему python правильно нашел путь __init__.py jinja2, но не смогнайти utils.py, который находится в том же каталоге?
~$ ls /home/xxx/.pex/install/Jinja2-2.10.3-py2.py3-none-any.whl.02f611acfe90225e024bd496a640e01844bf5a32/Jinja2-2.10.3-py2.py3-none-any.whl/jinja2/
asyncfilters.py  bccache.py  compiler.py   debug.py     environment.py  ext.py      _identifier.py  __init__.py  loaders.py  nativetypes.py  optimizer.py  runtime.py  tests.py  visitor.py
asyncsupport.py  _compat.py  constants.py  defaults.py  exceptions.py   filters.py  idtracking.py   lexer.py     meta.py     nodes.py        parser.py     sandbox.py  utils.py

1 Ответ

0 голосов
/ 03 ноября 2019

Подтверждено, что это проблема Pex.

Pex загружен jinja2 в начале (который также включает jinja2.utils), затем он удалил модуль jinaj2 и путь, но не смог удалить jinja2.utils.

Проблема была исправлена ​​в последней версии pex: https://github.com/pantsbuild/pex/commit/0f9bf622e1565dcdd27c3b79b788571c9608c272

...