Не удается получить Python для импорта из другой папки
Я не могу показаться, чтобы получить Python, чтобы импортировать модуль в папку. Я получаю ошибку, когда я пытаюсь создать экземпляр класса из импортированного модуля, но сам импорт проходит успешно. Вот моя структура каталогов:
Server
-server.py
-Models
--user.py
вот содержание server.py:
from sys import path
from os import getcwd
path.append(getcwd() + "models") #Yes, i'm on windows
print path
import user
u=user.User() #error on this line
и user.py:
class User(Entity):
using_options(tablename='users')
username = Field(String(15))
password = Field(String(64))
email = Field(String(50))
status = Field(Integer)
created = Field(DateTime)
ошибка:
AttributeError: объект 'module' не имеет атрибута 'User'
7 ответов:
Я считаю, что вам нужно создать файл под названием
__init__.pyв каталоге Models, чтобы python рассматривал его как модуль.затем вы можете сделать:
from Models.user import Userвы можете включить код в тег
__init__.py(например, код инициализации, который нужен нескольким разным классам) или оставьте его пустым. Но он должен быть там.
импорт
u=пользователь.Пользователь () #ошибка в этой строке
из-за отсутствия __init__ упомянутого выше, вы ожидаете ImportError, который сделает проблему более ясной.
вы не получите его, потому что "пользователь" также является существующим модулем в стандартной библиотеке. Ваш оператор импорта захватывает его и пытается найти класс пользователя внутри него; это не существует, и только тогда вы получаете ошибку.
Это вообще хорошая идея, чтобы сделать ваш импорт абсолютной:
import Server.Models.userчтобы избежать такого рода двусмысленности. Действительно, из Python 2.7 "импорт пользователя" не будет выглядеть относительно текущего модуля вообще.
Если вы действительно хотите относительный импорт, вы можете иметь их явно в Python 2.5 и выше, используя несколько уродливый синтаксис:
from .user import User
ты пропал __init__.py. из учебника по Python:
о __init__.py файлы необходимы для заставить Python рассматривать каталоги как содержащие пакеты; это делается для того, чтобы запретить каталоги с общим имя, например строка, от непреднамеренное скрытие допустимых модулей которые происходят позже при поиске модуля путь. В самом простом случае, __init__.py может быть просто пустой файл, но он также может выполнять инициализацию код для пакета или установить __ все _ _ переменные, описанные ниже.
поместите пустой файл с именем __init__.py в вашем каталоге моделей, и все должно быть золотым.
правильный способ импорта модуля, расположенного в родительской папке, когда у вас нет стандартной структуры пакета, это:
import os, sys CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.append(os.path.dirname(CURRENT_DIR))(вы можете объединить последние две строки, но таким образом легче понять).
Это решение является кросс-платформенным и достаточно общим, чтобы не нужно было изменять в других обстоятельствах.
Как вы пишете параметры
os.path.dirname.... командование?import os, sys CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.append(os.path.dirname(CURRENT_DIR))
мой предпочтительный способ-иметь __init__.py в каждом каталоге, содержащем модули, которые используются другими модулями, и в точке входа переопределите sys.путь, как показано ниже:
def get_path(ss): return os.path.join(os.path.dirname(__file__), ss) sys.path += [ get_path('Server'), get_path('Models') ]это делает файлы в указанных каталогах видимыми для импорта, и я могу импортировать пользователя из Server.py.
Comments