Как ссылаться на пакет python, когда имя файла содержит точку - PullRequest
34 голосов
/ 01 декабря 2009

Я использую django, у меня есть файл с именем models.admin.py, и я хочу реализовать следующую идею в models.py:

from "models.admin" import *

однако я получаю синтаксическую ошибку для двойных кавычек. Но если я просто сделаю

from models.admin import *

тогда я получаю "ImportError: Нет модуля с именем admin"

Есть ли способ импортировать из файла python, у которого в имени есть точка?

Ответы [ 5 ]

27 голосов
/ 01 декабря 2009

На самом деле, вы можете импортировать модуль с недопустимым именем. Но для этого вам нужно будет использовать imp, например, при условии, что файл называется models.admin.py, вы можете сделать

import imp
with open('models.admin.py', 'rb') as fp:
    models_admin = imp.load_module(
        'models_admin', fp, 'models.admin.py',
        ('.py', 'rb', imp.PY_SOURCE)
    )

Но прочитайте документы по imp.find_module и imp.load_module, прежде чем начать его использовать.

12 голосов
/ 01 декабря 2009

Если вы действительно хотите, вы можете импортировать модуль с необычным именем файла (например, имя файла, содержащее «.» Перед «.py»), используя модуль imp:

>>> import imp
>>> a_b = imp.load_source('a.b', 'a.b.py')
>>> a_b.x
"I was defined in a.b.py!"

Однако, как правило, это плохая идея. Скорее всего, вы пытаетесь использовать пакеты, и в этом случае вам следует создать каталог с именем «a», содержащий файл с именем «b.py»; а затем "import a.b" загрузит a / b.py.

4 голосов
/ 01 декабря 2009

Файл называется models/admin.py. ( Источник )

То есть он должен называться admin.py в каталоге с именем models.

Затем вы можете импортировать, используя from models.admin import *, предполагая, что он находится в вашем пути Python.

2 голосов
/ 01 декабря 2009

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

0 голосов
/ 01 декабря 2009

Вы не ссылаетесь на файлы в операторе импорта, вы ссылаетесь на модулей и пакетов .

Пожалуйста, прочитайте документы , в этом они очень ясны.

В любом случае, поскольку вы используете django, обычный подход не сработает. Если вы хотите хранить модели в отдельных файлах, а не в models.py, вам нужно предпринять дополнительные шаги, описанные, например, здесь .

Edit:
Ну, я действительно не знаю, что подразумевает спрашивающий, когда он упоминает администратора и имеет ли он отношение к интерфейсу администратора django. Мои очки остаются в силе.

...