2015-09-18 4 views
2

Я пытаюсь импортировать пакет, присутствующий в другой папке, и он отлично работает в python 3.4. Для примера: файлы присутствуют в папке библиотекРазница между импортирующим модулем в Python 3.4 и Python 2.7

user> python 
Python 3.4.1 (default, Nov 12 2014, 13:34:29) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from libraries.controller_utils import * 
>>>  

Однако, когда я открываю новую оболочку и использовать Python 2.7:

user> python 
Python 2.7.4 (default, Jun 1 2015, 10:35:58) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-55)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from libraries.controller_utils import * 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named libraries.controller_utils 
>>> 

Я попытался добавить запись в sys.path, но это не помогает. Я прочитал аналогичный вопрос here, но решение не помогает мне, поскольку я пробовал как относительный, так и абсолютный импорт. Пожалуйста посоветуй.

EDIT: Структура каталогов ~/tests/libraries/controller_utils.py. Я выполняю эти команды внутри каталога тестов.

EDIT: Я добавил запись sys.path следующим образом, но она все еще не распознает ее. Обратите внимание, что ошибка происходит на 2.7, но работает абсолютно нормально на 3,4

user> cd ~/tests/ 
user> ls 
__pycache__ backups inputs libraries openflow.py test_flow.py 
user> ls libraries/ 
__pycache__ controller_utils.py general_utils.py general_utils.pyc tc_name_list.py test_case_utils.py 
user> python 
Python 2.7.4 (default, Jun 1 2015, 10:35:58) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-55)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from libraries.controller_utils import * 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named libraries.controller_utils 
>>> import sys 
>>> sys.path.append('libraries/') 
>>> from libraries.controller_utils import * 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named libraries.controller_utils 
+2

Какова структура каталогов для модуля, который вы импортируете? в каком каталоге вы используете python? –

+1

Какую «запись» вы добавили в 'sys.path' (и как вы ее добавили?)? Как правило, с относительными проблемами импорта, я ожидаю, что вы найдете модуль на python2.x, а не на python3.x ... – mgilson

+1

Неверный способ изменения 'sys.path'. если вы добавите 'libraries /' в 'sys.path', то вы должны использовать' from controller_utils import * 'not' from libraries.constroller_utils import * '. – Bakuriu

ответ

5

В вашем libraries пакетах отсутствует файл __init__.py. Вы можете создать пустой файл с этим именем, а затем:

from libraries.controller_utils import * 

должно работать.

В качестве альтернативы, если вы не хотите, чтобы превратить libraries в пакет, который вы должны добавить свой путь к sys.path и импортировать controller_utils:

import sys 

sys.path.append('libraries/') 
from controller_utils import * 

Обратите внимание, что ошибка происходит из-за того, что python2 требует наличия __init__.py для импорта из пакетов, тогда как python3.3 + предоставляет namespace packages (см. PEP420). Вот почему импорт не прерывается в python3.4.

Если вы хотите, чтобы ваш код для работы в обоих python2 и Python3 таким же образом, вы всегда должны добавить __init__.py файл в пакеты и использования from __future__ import absolute_import в ваших файлах.

+0

Для Python 3 это называется пакетом пространства имен. Подробности - https://www.python.org/dev/peps/pep-0420/ или https://docs.python.org/3/reference/import.html#namespace-packages или http: // stackoverflow. com/a/32317916/795990 –

+0

@AnandSKumar Да, я просто изучал это сейчас. – Bakuriu

0

PEP 0404 См.

В Python 3 неявный относительный импорт внутри пакетов больше не доступен - поддерживаются только абсолютный импорт и явный относительный импорт. Кроме того, импорт звездочек (например, из x import *) разрешен только в коде уровня модуля.

Если libraries был в том же каталоге, это случилось бы, чтобы избежать столкновений с пакетами, установленными на системном уровне. Это был бы неявный относительный импорт.

Вы должны быть в состоянии навигационного для правильного расположения модуля с использованием .., как:

from ..libraries.controller_utils import * 
# or, depending of you directory structure 
# put as many dots as directories you need to get out of 
from ....common.libraries.controller_utils import * 

Но ваше дело, кажется, связано с звезды импорта. В Python 3 вы можете использовать только импорт звезд (from x import *) на верхнем уровне файла, то есть внутри функции или определения класса.

+0

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

+0

@anand Вы правы. В любом случае, я оставлю свой ответ, так как он может помочь кому-то другому, кто попадает сюда, ища тот же вопрос. – sergiopereira

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