Python 3.4.0 не может импортировать модуль через скрипт, который успешно импортируется в интерпретаторе

Я не новичок в Python, но столкнулся со странной проблемой.

Я установил эту структуру проекта Python (отрывок):

  • проект-A/myapp
  • проект-B/ядро/общий/библиотека

где myapp/core, common & lib — это пакеты Python.

Каталог проекта-B установлен в пути python как «/root_path/to/core_module»

когда я запускаю скрипт, который импортирует модули в каталог project-A/myapp:

from core.common.lib import Error, XmlSource, Property, Preference

он вызывает ошибку:

ImportError: нет модуля с именем «ядро»

без изменения текущего каталога в интерпретаторе python3 и ввода той же команды:

jeby6372@mercure:~/factory/bubble$ python3
Python 3.4.0 (default, Apr  9 2014, 20:03:10) 
[GCC 4.7.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from core.common.lib import Error, XmlSource, Property, Preference
>>> 

Модуль загружен... Я ожидал того же поведения, что и выше, во время выполнения скрипта.

поэтому я пытаюсь добавить эту команду перед оператором импорта, который терпит неудачу

os.environ['PYTHONPATH'] = '/root_path/to/core_module'

без успеха...

Есть идеи ?

Возможно, я ошибаюсь, но я предполагаю, что интерпретатор python3 ищет относительный путь модулей импорта, указанный сначала в текущем каталоге, а затем в определенном пути python, где бы он ни вызывался.

Спасибо за вашу помощь


person Emmanuel BRUNET    schedule 02.05.2014    source источник
comment
Вы уже смотрели syspath во время выполнения, то есть перед импортом из core.common.lib: import sys print sys.path   -  person ProfHase85    schedule 02.05.2014
comment
Спасибо за ваш интерес. непосредственно перед импортом sys.path не отображает ожидаемый /root_path/to/core_module (/home/jeby6372/factory/F14). Похоже, что скрипт Python был выполнен в другой среде. : '/opt/python-3.4.0/lib/python3.4/site-packages/lxml-3.3.4-py3.4-linux-x86_64.egg', '/opt/python-3.4.0/lib/ python3.4/site-packages/httpagentparser-1.6.0-py3.4.egg', '/opt/python-3.4.0/lib/python3.4/site-packages/CherryPy-...   -  person Emmanuel BRUNET    schedule 02.05.2014
comment
Или, возможно, это новое поведение 3.4?   -  person Emmanuel BRUNET    schedule 02.05.2014
comment
Вы говорите: каталог проекта-B установлен в пути python как '/root_path/to/core_module'. Как это делается? Вы используете виртуалэнв?   -  person ProfHase85    schedule 02.05.2014
comment
просто чтобы избежать настоящих имен, которые иногда вызывают недоразумения. На самом деле я добавил /home/jeby6372/factory/F14/ к пути python: каталог project-B, project-A — это /home/jeby6372/bubble/   -  person Emmanuel BRUNET    schedule 03.05.2014
comment
редактировать: каталог project-A = /home/jeby6372/factory/bubble/   -  person Emmanuel BRUNET    schedule 03.05.2014


Ответы (1)


Установка PYTHONPATH внутри интерпретатора не поможет, так как он читается при запуске интерпретатора. Решением было бы добавить путь к основному модулю к sys.path непосредственно перед его импортом, т.е.

import sys
sys.path.append('/path/to/core/module')
import core.module

Я думаю, вы забыли экспортировать pythonpath, попробуйте (в оболочке):

export PYTHONPATH='/path/to/core/module'
python your_python_script.py
person ProfHase85    schedule 04.05.2014
comment
Спасибо. Он работает, размещая sys.path.append, как уже упоминалось. Но не для моих программ, которые терпят неудачу через несколько строк после доступа к файлу относительного пути. Использование os.path.abspath('relative/path/to/core/module/file') относится к Projetc_A/myapp/relative/path/to/core/module/file .., поэтому я не работаю в своем заявление. Я добавил символическую ссылку на мой основной модуль в каталоге myapp, и теперь все в порядке. - person Emmanuel BRUNET; 06.05.2014