2016-02-10 2 views
0

Импорт пакета с:Python работает импорт в 2,7, но не в 3.2+

from unique_upload import unique_file_upload 

Работает в Python 2.7, но не в Python 3.2 и выше:

ImportError: cannot import name unique_file_upload 

Структура проекта:

test/ 
    __init__.py 
    test_unique_upload # <-- calling from unique_upload import unique_file_upload here 

unique_upload/ 
     __init__.py 
     unique_upload 

unique_upload/__init__.py содержит:

__version__ = '0.2.0' 
from unique_upload import unique_file_upload 

Полный трассировки стека:

ImportError: Failed to import test module: test_unqiue_upload 
Traceback (most recent call last): 
    File "/opt/python/3.5.0/lib/python3.5/unittest/loader.py", line 428, in _find_test_path 
    module = self._get_module_from_name(name) 
    File "/opt/python/3.5.0/lib/python3.5/unittest/loader.py", line 369, in _get_module_from_name 
    __import__(name) 
    File "/home/travis/build/agconti/django-unique-upload/test/test_unqiue_upload.py", line 4, in <module> 
    from unique_upload import unique_file_upload 
    File "/home/travis/build/agconti/django-unique-upload/unique_upload/__init__.py", line 2, in <module> 
    from unique_upload import unique_file_upload 
ImportError: cannot import name 'unique_file_upload' 

Любая идея, почему это происходит?

ответ

2

Кажется, вы столкнулись с одним из несовместимого изменения Python: Relative imports, иначе PEP 328.

Это должно работать:

from .unique_upload import unique_file_upload 
+0

'от __future__ импорта absolute_import' – MaxNoe

+0

Этот' от __future__ import' делает противоположное тому, что просит плакат: он сломал бы сборку для 2.x так же, как и для 3.x. Ну, по крайней мере, это было бы непротиворечиво ;-). –

+0

Я должен был написать это. Я хотел предложить использовать ваше решение, чтобы заставить его работать с 3.x, а затем добавить будущий импорт, чтобы добавить обратно совместимость 2.x / – MaxNoe

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