Не удается получить 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   69   2009-01-19 06:53:35

7 ответов:

Я считаю, что вам нужно создать файл под названием __init__.py в каталоге Models, чтобы python рассматривал его как модуль.

затем вы можете сделать:

from Models.user import User

вы можете включить код в тег __init__.py (например, код инициализации, который нужен нескольким разным классам) или оставьте его пустым. Но он должен быть там.

вы должны создать __init__.py на Models папку. Файл может быть пустым. Он определяет пакет.

затем вы можете сделать:

from Models.user import User

прочитайте все об этом в учебнике python,здесь.

есть также хорошая статья о файловой организации проектов python здесь.

импорт

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.