2009-03-06 15 views
17

Ho creato una sottodirectory del mio progetto Django chiamato bin dove voglio inserire tutti gli script Python da linea di comando. Alcuni di questi script devono importare il file settings.py del progetto Django che si trova in una directory principale di bin.Come importare un file Python settings.py in un file Python da una sottodirectory?

Come è possibile importare il file settings.py da una sottodirectory del progetto?

Il codice che uso nel mio script da riga di comando per impostare nel "contesto Django" del progetto è:

from django.core.management import setup_environ 
import settings 
setup_environ(settings) 

Questo funziona bene se lo script si trova nella directory principale del mio progetto.

ho provato i seguenti due hack per importare il file settings.py e poi messa a punto del progetto:

import os 
os.chdir("..") 

import sys 
sys.path = [str(sys.path[0]) + "/../"] + sys.path 

L'hack crudele possibile importare settings.py, ma poi ho l'errore:

project_module = __import__(project_name, {}, {}, ['']) 
ValueError: Empty module name 

risposta

10

Questo sta andando un livello superiore rispetto alla tua domanda, ma probabilmente la soluzione migliore è quella di implementare i propri script come custom manage.py (django-admin.py) commands. Questo ti dà tutte le funzionalità di Django (comprese le impostazioni) gratuitamente senza brutti percorsi di hacking, così come le sottigliezze da riga di comando come l'analisi delle opzioni. Non ho mai visto una buona ragione per scrivere script da riga di comando relativi a Django in altro modo.

+0

Grazie per la risposta, ero troppo pigro per cercare di aggiungere comandi di gestione prima, ma è proprio quello che volevo fare e aiuta a mantenere tutti i miei script in un unico posto. – MikeN

2

Add la directory superiore al percorso:

import sys 
sys.path.append('../') 
import settings 

Aggiornamento da commenti:

Don't forget the __init__.py file in the directory that has your settings.py – S.Lott

+0

Ho aggiornato la domanda, c'è ancora un errore anche se settings.py è nel percorso. – MikeN

+0

Non dimenticare il file __init__.py nella directory con le tue impostazioni.py –

+0

Esiste un file __init__.py, che non funziona. – MikeN

16

penso che il tuo approccio può essere over-complicare qualcosa che Django 1.x fornisce per voi. Fino a quando il progetto è nel tuo percorso di pitone, è possibile impostare la DJANGO_SETTINGS_MODULE variabile d'ambiente nella parte superiore dello script in questo modo:

import os 
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings' 

Nello script da riga di comando in cui è necessario leggere le impostazioni, è sufficiente importare il modulo impostazioni da 'django.conf' come si farebbe nel codice dell'applicazione:

from django.conf import settings 

e presto, avete le impostazioni e un ambiente Django abilitato per lo script.

Io personalmente preferisco per impostare il mio DJANGO_SETTINGS_MODULE usando '/ usr/bin/env' in uno script bash chiamato 'proj_env' quindi non dover ripetere

#!/bin/bash 

proj_env="DJANGO_SETTINGS_MODULE=myproject.settings" 

/usr/bin/env $proj_env ${*} 

Con questo, ora posso eseguire qualsiasi script python con la mia applicazione Django nel contesto:

proj_env python -m 'myproject.bin.myscript' 

Se si utilizza virtualenv, questo ti dà anche un buon posto per risalire allo script di attivazione.

ecc ecc

+0

Quindi la directory sopra la directory del progetto deve essere nel percorso Python? E la directory di progetto che contiene settings.py deve essere sempre nello stesso nome della directory? Il mio dev. il nome del progetto è diverso dal mio nome di produzione, il nome della directory ha un timestamp su di esso in produzione. – MikeN

+0

Abbiamo messo le nostre impostazioni in/var/this e le nostre app in/opt/that. Il nostro PYTHONPATH è "/ var/this:/opt/that". Le impostazioni sono separate dalle app. –

+0

Nell'esempio sopra il pacchetto 'myproject' deve trovarsi sul percorso python, ma questo dovrebbe già essere lì per trovarlo anche su Django. Il mio approccio funzionerebbe nel tuo ambiente di sviluppo, ma non sono sicuro di quali modifiche apportare per gestire un timestamp. –

Problemi correlati