Импорт пакета в этом пакете не работает в 2.7.15rc1, но работает в 2.7.15 - PullRequest
0 голосов
/ 14 января 2019

Я создаю веб-сайт с использованием Python Flask (для ответа на вопрос не требуется знание колбы). На моем компьютере я использую Python 2.7.15, и приложение работает нормально. Когда я перемещаю его на свой веб-сервер Ubuntu с python 2.7.15rc1, он перестает работать. Я использую несколько циклический импорт, но я убедился, что все работает (я могу справиться с циклическим импортом очень хорошо). Это обратная связь:

Traceback (most recent call last):
   File "/var/www/OpenNoteFlask/opennoteflask.wsgi", line 7, in <module>
     from OpenNoteFlask import app as application
   File "/var/www/OpenNoteFlask/OpenNoteFlask/__init__.py", line 1, in <module>
     from OpenNoteFlask import create_app
   File "/var/www/OpenNoteFlask/OpenNoteFlask/OpenNoteFlask/__init__.py", line 11, in <module>
     from OpenNoteFlask.config import Config
 ImportError: No module named config

Это моя файловая структура:

(The numbers in parenthesis are to distinguish the files and folders here.
They do not appear in the actual names of the files and folders)

OpenNoteFlask (1)
    __init__.py (1)
    OpenNoteFlask (2)
        __init__.py (2)
        config.py

Внутри __init__.py (1) У меня есть from OpenNoteFlask import create_app (и он успешно находит импорт).

Внутри __init__.py (2) У меня есть from OpenNoteFlask.config import Config (и импорт не найден). Опять же, это происходит только на моем веб-сервере Ubuntu, а не на моем ПК.

Я уже пробовал:

import sys
sys.path.insert(0, "path to parent of OpenNoteFlask (2)")
from OpenNoteFlask.config import Config

Но это ничего не меняет.

Повторюсь, у меня есть пакет OpenNoteFlask, где у меня есть файл __init__.py, который импортирует тот же самый модуль OpenNoteFlask пакета config.py, но он не может найти этот модуль. Это происходит только на моем веб-сервере Ubuntu, который работает с Python 2.7.15rc1, но отлично работает на моем ПК с Python 2.7.15.

Почему это происходит и как я могу это исправить или обойти?

РЕДАКТИРОВАТЬ: Решение

Я не думал прямо, называя все одинаково. Здесь была проблема, как было указано в комментариях:

На моем ПК это структура файла:

OpenNote
    __init__.py
    OpenNoteFlask
        __init__.py
        config.py

На моем веб-сервере это структура файла:

OpenNoteFlask
    __init__.py
    OpenNoteFlask
        __init__.py
        config.py

Проблема закончилась тем, что, поскольку у меня есть пакет с именем OpenNoteFlask внутри пакета с именем OpenNoteFlask, импорт from OpenNoteFlask ... был неоднозначным. Python интерпретировал этот импорт как импорт из родительского пакета, а не из подпакета. Решением было сделать разные имена пакетов (как на моем ПК).

1 Ответ

0 голосов
/ 14 января 2019

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

run.py
package
    __init__.py
    package
        __init__.py
        module.py
# run.py
import package

# package/__init__.py
import package

# package/package/__init__.py
from package import module

Кажется, проблема в том, что когда вызывается первый package, python вспоминает, что первый package - это THE package. Когда вызывается второй package, он ищет первый в своем собственном каталоге, находит второй package и импортирует его. При третьем импорте в каталоге нет другого package, поэтому он запоминает, что THE package является первым пакетом, и пытается импортировать его. Но поскольку файл module.py не является частью первого package, импорт завершается неудачей.

Решение простое: не иметь двух вложенных пакетов с одинаковым именем!

...