2009-03-06 22 views
17

Creé un subdirectorio de mi proyecto Django llamado bin en el que quiero poner todos los scripts de ejecución de línea de comandos de Python. Algunos de estos scripts necesitan importar mi proyecto Django settings.py que se encuentra en un directorio principal de bin.Cómo importar un archivo Python del proyecto Django settings.py desde un subdirectorio?

¿Cómo puedo importar el archivo settings.py desde un subdirectorio del proyecto?

El código que utilizo en mi script de línea de comando para establecer en el "contexto Django" del proyecto es:

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

Esto funciona bien si el guión está en el directorio raíz de mi proyecto.

Probé los dos cortes siguientes para importar el archivo settings.py y luego configuración del proyecto:

import os 
os.chdir("..") 

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

El truco cruel puede importar settings.py, pero luego me sale el error:

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

Respuesta

10

Esto va un nivel por encima de su pregunta, pero probablemente la mejor solución a este problema es la implementación de las secuencias de comandos como custom manage.py (django-admin.py) commands. Esto le da toda la funcionalidad de Django (incluida la configuración) de forma gratuita sin feo pirateo de ruta, así como detalles de línea de comandos como el análisis de opciones. Nunca he visto una buena razón para escribir scripts de línea de comandos relacionados con Django de otra manera.

+0

Gracias por la respuesta, era demasiado flojo para buscar comandos de administración antes, pero es justo lo que quería hacer y ayuda a mantener todos mis scripts en un solo lugar. – MikeN

2

Agregar el directorio principal de su ruta:

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

actualización de:

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

+0

He actualizado la pregunta, todavía hay un error incluso si settings.py está en la ruta. – MikeN

+0

No olvide el archivo __init__.py en el directorio que tiene su settings.py –

+0

Hay un archivo __init__.py, que no funciona. – MikeN

16

creo que su enfoque puede ser complicar algo que Django 1.x ofrece para usted. Mientras que su proyecto se encuentra en la ruta de Python, puede establecer la variable de entorno DJANGO_SETTINGS_MODULE en la parte superior de la secuencia de comandos, así:

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

En la secuencia de comandos de línea de comandos donde se necesita leer la configuración, sólo tiene que importar el módulo de configuración de 'django.conf' como lo haría en el código de aplicación:

from django.conf import settings 

y listo, usted tiene su configuración y un entorno compatible con Django para su guión.

yo personalmente prefiero poner mi DJANGO_SETTINGS_MODULE usando '/ usr/bin/env' en un script bash llamado 'proj_env', así que no tengo que repetirlo

#!/bin/bash 

proj_env="DJANGO_SETTINGS_MODULE=myproject.settings" 

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

Con esto, ahora puedo ejecutar cualquier script en Python con mi aplicación Django en su contexto:

proj_env python -m 'myproject.bin.myscript' 

Si utiliza virtualenv, esto también le da un buen lugar a la fuente de la secuencia de comandos de activación.

etc etc

+0

¿Entonces el directorio sobre su directorio de proyecto tiene que estar en la ruta de Python? ¿Y el directorio del proyecto que contiene settings.py debe estar en el mismo nombre de directorio todo el tiempo? Mi dev. el nombre del proyecto es diferente de mi nombre de producción, el nombre del directorio tiene una marca de tiempo en producción. – MikeN

+0

Ponemos nuestra configuración en/var/this y nuestras aplicaciones en/opt/that. Nuestra PYTHONPATH es "/ var/this:/opt/that". La configuración está separada de las aplicaciones. –

+0

En el ejemplo anterior, el paquete 'myproject' tiene que estar en la ruta de Python, pero eso ya debería estar allí para que Django lo encuentre también. Mi enfoque funcionaría en su entorno de desarrollo, pero no estoy seguro de qué ajustes hacer para lidiar con una marca de tiempo. –

Cuestiones relacionadas