2009-03-06 10 views
17

J'ai créé un sous-répertoire de mon projet Django appelé bin où je veux mettre tous les scripts Python exécutés en ligne de commande. Certains de ces scripts doivent importer mon fichier Django projet settings.py qui se trouve dans un répertoire parent de bin.Comment importer un fichier Django settings.py Fichier Python d'un sous-répertoire?

Comment puis-je importer le fichier settings.py à partir d'un sous-répertoire du projet?

Le code que j'utilise dans mon script de ligne de commande pour définir dans le « contexte Django » du projet est:

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

Cela fonctionne bien si le script est dans le répertoire racine de mon projet.

J'ai essayé les deux hacks suivants pour importer le fichier settings.py puis la configuration du projet:

import os 
os.chdir("..") 

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

Le hack cruel peut importer settings.py, mais je reçois l'erreur:

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

Répondre

10

Cela va d'un niveau de votre question, mais probablement la meilleure solution est ici pour mettre en œuvre vos scripts comme custom manage.py (django-admin.py) commands. Cela vous donne toutes les fonctionnalités de Django (y compris les paramètres) gratuitement, sans le moindre piratage de chemin, ainsi que des subtilités de ligne de commande comme l'analyse d'options. Je n'ai jamais vu une bonne raison d'écrire des scripts de ligne de commande liés à Django d'une autre manière.

+0

Merci pour la réponse, j'étais trop fainéant pour chercher en ajoutant des commandes de gestion auparavant, mais c'est exactement ce que je voulais faire et aider à garder tous mes scripts en un seul endroit. – MikeN

2

Ajouter le répertoire parent à votre chemin:

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

Mise à jour des commentaires:

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

+0

J'ai mis à jour la question, il y a toujours une erreur même si le settings.py est dans le chemin. – MikeN

+0

N'oubliez pas le fichier __init__.py dans le répertoire qui contient vos paramètres.py –

+0

Il existe un fichier __init__.py qui ne fonctionne pas. – MikeN

16

Je pense que votre approche peut être quelque chose de compliquer que 1.x Django fournit pour vous. Tant que votre projet est dans votre chemin python, vous pouvez définir l'environnement DJANGO_SETTINGS_MODULE variable en haut de votre script comme ceci:

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

Dans votre script de ligne de commande où vous avez besoin de lire vos paramètres, il suffit d'importer le paramètres de modules « django.conf » comme vous le feriez dans votre code d'application:

from django.conf import settings 

et presto, vous avez vos paramètres et un environnement compatible Django pour votre script.

Personnellement, je préfère mettre mon DJANGO_SETTINGS_MODULE en utilisant «/usr/bin/env » dans un script bash appelé « proj_env » donc je n'ai pas de le répéter

#!/bin/bash 

proj_env="DJANGO_SETTINGS_MODULE=myproject.settings" 

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

Avec cela, maintenant je peux exécuter un script python avec mon application Django dans le contexte:

proj_env python -m 'myproject.bin.myscript' 

Si vous utilisez virtualenv, cela vous donne aussi un bon endroit pour se procurer le script activate.

etc., etc.

+0

Donc le répertoire au-dessus de votre répertoire de projet doit être dans le chemin Python? Et le répertoire de projet contenant settings.py doit être dans le même nom de répertoire tout le temps? Mon dev. Le nom du projet est différent de mon nom de production, le nom du répertoire est horodaté en production. – MikeN

+0

Nous mettons nos paramètres dans/var/this et nos applications dans/opt/that. Notre PYTHONPATH est "/ var/this:/opt/that". Les paramètres sont distincts des applications. –

+0

Dans l'exemple ci-dessus, le paquet 'myproject' doit être sur le chemin python, mais cela devrait déjà être là pour que Django le trouve aussi. Mon approche fonctionnerait dans votre environnement de développement, mais je ne suis pas sûr des ajustements à apporter pour faire face à un horodatage. –

Questions connexes