2015-06-17 3 views
5

кажется, что если файл называется io.py и он импортирует scipy.ndimage, последний как-то в конечном итоге не в состоянии найти свой собственный подмодуль, называемый также io:Python и противоречивы модуль имена

$ echo "import scipy.ndimage" > io.py 
$ python io.py 
Traceback (most recent call last): 
    File "io.py", line 1, in <module> 
    import scipy.ndimage 
    File "/usr/lib/python2.7/dist-packages/scipy/__init__.py", line 70, in <module> 
    from numpy import show_config as show_numpy_config 
    File "/usr/lib/python2.7/dist-packages/numpy/__init__.py", line 153, in <module> 
    from . import add_newdocs 
    File "/usr/lib/python2.7/dist-packages/numpy/add_newdocs.py", line 13, in <module> 
    from numpy.lib import add_newdoc 
    File "/usr/lib/python2.7/dist-packages/numpy/lib/__init__.py", line 22, in <module> 
    from .npyio import * 
    File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 4, in <module> 
    from . import format 
    File "/usr/lib/python2.7/dist-packages/numpy/lib/format.py", line 141, in <module> 
    import io 
    File "/tmp/rm_me/io.py", line 1, in <module> 
    import scipy.ndimage 
    File "/usr/lib/python2.7/dist-packages/scipy/ndimage/__init__.py", line 172, in <module> 
    from .filters import * 
    File "/usr/lib/python2.7/dist-packages/scipy/ndimage/filters.py", line 37, in <module> 
    from scipy.misc import doccer 
    File "/usr/lib/python2.7/dist-packages/scipy/misc/__init__.py", line 45, in <module> 
    from .common import * 
    File "/usr/lib/python2.7/dist-packages/scipy/misc/common.py", line 10, in <module> 
    from numpy import exp, log, asarray, arange, newaxis, hstack, product, array, \ 
ImportError: cannot import name exp 

Является ли это ошибка в SciPy, или я использую Python неправильно?

Update: Я думаю, что менее удивительно поведение было бы, если import mod2 в mod1 решенных путях относительно mod1, а не по отношению к кто бы импортировано mod1.

+1

Это не ошибка в SciPy; это то, как работает импорт Python. Это, как говорится, я не уверен, что обходное решение, помимо вызова вашего модуля, что-то еще. – jangler

+0

Запустите 'python --version' и посмотрите, что вы получаете. – user2357112

+0

@ user2357112 2.7.6 (родной Ubuntu-14.04) – MaxB

ответ

3

Вы используете python неправильно.

Прежде чем создавать какой-либо модуль или пакет верхнего уровня на уровне python, вы должны убедиться, что у него нет модуля или пакета.

Лучшее решение здесь - не использовать модули верхнего уровня и вместо этого помещать все в один пакет верхнего уровня (то есть каталог с файлом __init__.py), названный в честь вашего проекта.

Чтобы проверить, существует ли модуль или пакет верхнего уровня, вы можете попробовать import использовать его в интерпретаторе или запустить pydoc name из оболочки.


Стоит отметить, что есть очень похожая ошибка, которая может случиться так, что это не ваша вина, если пакет использует синтаксис импорта абсолютного стиля для выполнения относительно импорта. Эта «функция» удаляется в Python3.

+0

Что произойдет, если позже добавится модуль/пакет, который конфликтует с вашим (верхним) именем? – JoshB

+0

@JoshB В этом случае ни одна из ваших зависимостей не будет импортировать ваше имя. – o11c

4

Простое решение состоит в том, чтобы не называть ваш модуль io, поскольку он противоречит имени модуля библиотеки.

Это на самом деле не ошибка в NumPy, но ошибка пользователя: так же, как мы не должны использовать list в качестве имени переменного, потому что это затенения встроенного list имени, мы не должны использовать io в качестве имени модуля, потому что это затенение ядро библиотека io имя модуля.

Смотрите эту часть:

File "/usr/lib/python2.7/dist-packages/numpy/lib/format.py", line 141, in <module> 
    import io 

numpy Здесь пытается импортировать io module. Это предназначено, чтобы найти stdlib io из-за абсолютного импорта - числовой подмодуль был бы загружен Относительный импорт, как вы можете видеть в traceback, где есть другая линия начала from .npyio import *.

Конечно, ваш собственный модуль io.py находится первым, потому что в текущем рабочем каталоге обычно есть первая запись в sys.path. Упс!

Смежные вопросы