«из __future__ import absolute_import» не отключает относительный импорт в блокнот Jupyter.Как это исправить? - PullRequest
0 голосов
/ 20 января 2019

Из этого поста:

Python: отключение относительного импорта

указано, что относительный импорт можно отключить с помощью:

from __future__ import absolute_import

Однако это правило, похоже, нельзя распространить на блокнот Jupyter.Вот быстрый эксперимент, когда я создаю файл python, имя которого совпадает с именем пакета python (в данном случае networkx).Это может привести к сбою полного импорта этого пакета.Ниже приведен снимок экрана, описывающий этот случай:

enter image description here

Установленный пакет 'network' уже содержит подмодуль 'drawing', но импорт завершился неудачно сследующее сообщение:

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-2-e38c4f8fc4a0> in <module>
      1 from __future__ import absolute_import
      2 
----> 3 from networkx import drawing

ImportError: cannot import name 'drawing'

Как это исправить в блокноте Jupyter или в лаборатории Jupyter?Означает ли это, что я не могу избежать относительного импорта?

ОБНОВЛЕНИЕ : большое спасибо за ответы, один из них - предложить мне испорченный PYTHONPATH (или sys.путь), это не тот случай, я добавил следующую строку, чтобы показать несоответствие PYTHONPATH и пути разрешенного модуля:

from __future__ import absolute_import
import os
import sys


for p in sys.path:
    print(p)

print("=================")

import networkx
print(os.path.abspath(networkx.__file__))

from networkx import drawing

результат:

> /home/shared/anaconda3/lib/python36.zip
> /home/shared/anaconda3/lib/python3.6
> /home/shared/anaconda3/lib/python3.6/lib-dynload
> /home/peng/.local/lib/python3.6/site-packages
> /home/shared/anaconda3/lib/python3.6/site-packages
> /home/shared/anaconda3/lib/python3.6/site-packages/IPython/extensions
> /home/peng/.ipython
> ================= /home/peng/git/convnet-abstraction/slide/package/networkx.py
> --------------------------------------------------------------------------- ImportError                               Traceback (most recent call
> last) <ipython-input-4-d28ac292787c> in <module>
>      12 print(os.path.abspath(networkx.__file__))
>      13 
> ---> 14 from networkx import drawing
> 
> ImportError: cannot import name 'drawing'

Вот еще один скриншот:

enter image description here

1 Ответ

0 голосов
/ 20 января 2019

Относительный импорт здесь не актуален.sys.path вероятно выглядит примерно так:

[
 '',  # the current directory
 'C:\\Program Files\\Python 3.5\\python35.zip',
 'C:\\Program Files\\Python 3.5\\DLLs',
 'C:\\Program Files\\Python 3.5\\lib',
 'C:\\Program Files\\Python 3.5', 
 #network x is in one of these two
 'C:\\Users\\<you>\\AppData\\Roaming\\Python\\Python35\\site-packages',
 'C:\\Program Files\\Python 3.5\\lib\\site-packages'
]

Когда вы набираете import networkx, он проходит через каждый из этих каталогов в порядке поиска либо networkx.py.Сначала он найдет тот, который находится в «папке без названия».

Лучший способ исправить это - переименовать файл или поместить его в подкаталог, mystuff/networkx

может быть плохой идеей, но вы также можете сделать sys.path.remove(''), чтобы удалить первую запись.

...