2009-12-01 3 views
27

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

from "models.admin" import * 

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

from models.admin import * 

тогда я получаю «ImportError: Нет модуля имени администратора»

Есть ли способ, чтобы импортировать из питона файла (который имеет период своего имени)?

+7

HELLO HELLO, что ** заставляя ** у вас есть имя файла, например models.admin.py ?? Почему бы не назвать его models_admin.py или models/admin.py или что-то еще вписывается в Django? –

+7

Пожалуйста, не делайте этого. –

+1

Технически, это модуль, а не пакет. – Cerin

ответ

23

На самом деле, вы можете импортировать модуль с недопустимым именем. Но вам нужно использовать 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, прежде чем начать использовать его.

+3

Плохая практика? 'imp' - механизм, лежащий в основе' import' и '__import__'. Больше гибкости, но требует большего количества кода. Однако ничего волшебного в этом нет. –

+5

И машинный код - это механизм за всем. Больше гибкости и ... см., Куда я иду? :) – shylent

+1

Вам, очевидно, нужно подумать дважды, если вам действительно нужно его использовать, но я не вижу, как это ужасно неправильно. ;) И он используется в производстве - см., Например, Trac - http://trac.edgewall.org/browser/trunk/trac/loader.py. –

4

Файл называется models/admin.py. (Source)

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

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

2

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

+0

У вас есть справочная информация для этого? – Taras

+2

Ссылка на грамматику Python (https://docs.python.org/2/reference/grammar.html). Однако это фактически указывает только то, что разрешено для оператора импорта - как указано выше в принятом ответе, технически можно обойти это, используя основные механизмы импорта. –

0

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

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

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

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

+1

Модуль - это файл. Чтобы процитировать документы, на которые вы ссылались: «Чтобы поддерживать это, Python имеет возможность помещать определения в файл и использовать их в скрипте или в интерактивном экземпляре интерпретатора. Такой файл называется модулем, ' –

10

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

>>> 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.

+1

' load_source' устарел с не менее 1,5. –

+0

Правда, хотя не устаревший способ сделать это довольно много слов: a_b = imp.load_module ('a.b', open ('abpy'), os.path.abspath ('abpy'), ('.py', 'r', imp.PY_SOURCE)) –

Смежные вопросы