импорт python ведет себя странно

Я хотел использовать полные имена импорта в своем проекте (см. этот вопрос). Описанная там проблема решена и все работает нормально (редактировать: если скрипт запущен с execfile) вне eclipse и pydev (работает на windows), в ccps на linux (со встроенным jython) . Однако затмение дает мне следующую ошибку:

from Project.gui import gui
ImportError: No module named gui

в то время как структура моего проекта включает следующее (все без .py - это папка):

Project
    __init__.py
    gui
        __init__.py
        gui.py
    Project.py

Я запускаю Project.Project.py и получаю указанную выше ошибку. print sys.path прямо перед критическим импортом:

['****\\Root\\Project', '****\\Root', 
 *bunch of jars/jython libs*,
'__classpath__', '__pyclasspath__/']

Я запускаю eclipse и PyDev.


person ted    schedule 15.06.2012    source источник
comment
не могли бы вы попробовать переименовать Project.py во что-то другое и повторить попытку импорта?   -  person marlboro    schedule 15.06.2012
comment
я только что сделал, это решение, по какой-то причине он игнорирует пакет, если видит модуль с таким именем... . Просто для взлома: есть ли способ заставить python действительно искать оба, если один терпит неудачу?   -  person ted    schedule 15.06.2012
comment
есть ли способ сделать поиск python для обоих, если один из них не работает - Да. Почитайте try и except. Вероятно, это будет выглядеть примерно так: try: import Project; except ImporError: import Foo as Project   -  person mgilson    schedule 15.06.2012
comment
Почему вы даете модулям те же имена, что и их родительские пакеты?   -  person Eric    schedule 15.06.2012
comment
Поскольку это удобный скрипт, предполагается, что он запускает графический интерфейс для предоставленных модулей, и я подумал, что это более удобно, чем index.py, поскольку я не знаю какого-либо стандарта для основного файла, я знаю, изменил его на начало, которое мне тоже не нравится   -  person ted    schedule 15.06.2012
comment
@ted - часто основной файл называется core.py, но я не думаю, что для этого существует какое-то действительно установленное соглашение. Также обратите внимание, что в зависимости от того, что вы записали в __init__.py, пользователю не обязательно знать имя основного файла.   -  person mgilson    schedule 15.06.2012
comment
@mgilson хорошо, я не хочу, чтобы init запускал графический интерфейс, так как я хочу, чтобы пользователь мог импортировать весь пакет для его функциональности, не запуская графический интерфейс, спасибо за подсказку с core.py   -  person ted    schedule 15.06.2012
comment
@Eric: Я знаю, что это было давно, но я только что заметил, что ты затронул этот вопрос. Спасибо, я всегда ищу возможности улучшить свой английский, так что продолжайте в том же духе.   -  person ted    schedule 22.10.2012


Ответы (1)


Поскольку \\Root\\Project находится первым в вашем пути, он сначала заглянет в папку Project, поэтому from Project.gui увидит Project.py, но затем выдаст ошибку, потому что нет графического интерфейса.

Вы можете временно поставить sys.path.insert(0,"****\\Root") перед импортом, просто чтобы проверить, так это или нет. Но я бы убрал ****\\Root\\Project из вашего PYTHON_PATH.

тогда вы могли бы сделать

from Project import Project

а также

from Project.gui import gui
person GP89    schedule 15.06.2012
comment
хорошо, спасибо за правильное решение, я переименую файл, хотя, как предложил Мариус, так как я считаю, что это проще и проще - person ted; 15.06.2012