2009-12-01 14 views
27

Sto usando Django e ho un models.admin.py file di nome e voglio fare la seguente idea in models.py:come fare riferimento pacchetto python quando il nome del file contiene un punto

from "models.admin" import * 

tuttavia, Ottengo un errore di sintassi per avere virgolette doppie. Ma se io faccio solo

from models.admin import * 

allora ottengo "ImportError: No module named admin"

Esiste un modo per importare da un file python (che ha un periodo nel suo nome)?

+7

CIAO CIAO cosa è ** forzare ** di avere un nome di file come models.admin.py ?? Perché non chiamarlo models_admin.py o models/admin.py o quant'altro si adatta a Django? –

+7

Si prega di non farlo. –

+1

Tecnicamente, questo è un modulo, non un pacchetto. – Cerin

risposta

23

In realtà, è possibile importare un modulo con un nome non valido. Ma dovrai utilizzare imp per quello, ad es. file di assumendo il nome models.admin.py, si potrebbe fare

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

Ma leggere la documentazione sul imp.find_module e imp.load_module prima di iniziare ad usarlo.

+3

Cattiva pratica? 'imp' è il meccanismo dietro' import' e '__import__'. Più flessibilità, ma richiede più codice. Niente di magico, comunque. –

+5

E il codice macchina è il meccanismo dietro tutto. Più flessibilità e ... vedi dove sto andando? :) – shylent

+1

Ovviamente devi pensarci due volte se hai davvero bisogno di usarlo, ma non vedo come utilizzarlo sia terribilmente sbagliato. ;) Ed è utilizzato nella produzione - vedi ad es. Trac: http://trac.edgewall.org/browser/trunk/trac/loader.py. –

4

Il file si chiama models/admin.py. (Source)

Cioè, dovrebbe essere chiamato admin.py in una directory denominata models.

Quindi è possibile importare utilizzando from models.admin import *, assumendo che si trovi nel percorso Python.

2

No, non è possibile importare un file python come modulo se il suo nome contiene un punto (o un punto interrogativo, un punto esclamativo, ecc.). Il nome di un modulo python (che non include il .py) deve essere un nome python valido (cioè può essere usato come nome di variabile).

+0

Hai un riferimento utile per questo? – Taras

+2

Il riferimento è la specifica della grammatica di Python (https://docs.python.org/2/reference/grammar.html). Tuttavia, questo in realtà specifica solo ciò che è consentito per la dichiarazione di importazione - come sottolineato sopra nella risposta accettata, è tecnicamente possibile aggirare questo usando i meccanismi di importazione sottostanti. –

0

Non fa riferimento file nella dichiarazione di importazione, si fa riferimento moduli e pacchetti.

Si prega di leggere il docs, sono molto chiari al riguardo.

In ogni caso, dal momento che si utilizza Django, il solito approccio non funzionerà. Se si desidera mantenere i modelli in file separati, piuttosto che in models.py, è necessario eseguire ulteriori passaggi, delineati, ad esempio, here.

Modifica:
Beh, non so davvero cosa significhi il venditore quando menziona l'amministratore e se sia o meno correlato all'interfaccia di amministrazione di django. I miei punti sono ancora validi.

+1

Un modulo è un file. Per citare i documenti a cui si fa riferimento: 'Per supportare questo, Python ha un modo per inserire le definizioni in un file e usarle in uno script o in un'istanza interattiva dell'interprete. Tale file è chiamato modulo; ' –

10

Se davvero desidera, è possibile importare un modulo con un nome di file originale (ad esempio, un nome di file che contiene una prima del '.py' '') utilizzando il modulo imp:

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

Tuttavia, questa è generalmente una cattiva idea. È più probabile che tu stia cercando di usare i pacchetti, nel qual caso dovresti creare una directory chiamata "a", contenente un file chiamato "b.py"; e quindi "importa a.b" caricherà a/b.py.

+1

' load_source' è obsoleto da almeno 1.5. –

+0

È vero, anche se il modo non obsoleto per farlo è un po 'più complesso: a_b = imp.load_module (' a.b ', open (' abpy '), os.path.abspath (' abpy '), ('.py', 'r', imp.PY_SOURCE)) –

Problemi correlati