2010-08-24 12 views
6

Mi problema es conseguir que manage.py syncdb se ejecute dentro de un virtualenv.Django no encuentra aplicaciones en virtualenv cuando usa manage.py syncdb

Funcionaba bien en un punto, pero parece haberse roto en algún momento cuando instalé South y actualicé pip y distribuí.

De todos modos, cuando se activa virtualenv, puedo importar aplicaciones bien dentro del intérprete interactivo. Ejecutando a través de mod_wsgi, las aplicaciones también se importan y el sitio puede ejecutarse.

Cuando ejecuto manage.py syncdb, no puede encontrar ninguna aplicación en INSTALLED_APPS que esté en mi virtualenv. Detecta bien las aplicaciones instaladas en el sistema, pero falla cuando trata de importar virtualenv solo las aplicaciones.

+1

¿Cuáles son los contenidos del tinglado línea en la parte superior de la manage.py que está ejecutando? ¿Cuáles son los comandos exactos que usa para ejecutar el intérprete interactivo de Python y manage.py cuando su virtualenv está activado? –

Respuesta

5

Hola Esta es una pregunta anterior, pero no fue respondida. No está seguro de lo que está tratando de hacer, pero hay básicamente dos modos que puede utilizar virtualenv,

  1. para el desarrollo, para crear entornos autónomos
  2. Para la implementación, para crear entornos autónomos

En el primer caso, primero necesita activar su virtualenv con source venv/bin/activate, para cuando implemente, debe asegurarse de que el virtualenv esté activado para el código de su sitio web. Personalmente, prefiero el siguiente enfoque para garantizar que su ruta esté configurada correctamente. (Añado también esto a mi manage.py cuando se hace el desarrollo, por lo que no tiene que preocuparse acerca de la activación del medio ambiente en primer lugar.

manage.py Modificado

#!/usr/bin/env python 
import os.path 

# Cater for Virtual env, add to sys.path 
pwd = os.path.abspath(os.path.dirname(__file__)) 
project = os.path.basename(pwd) 
new_path = pwd.strip(project) 
activate_this = os.path.join(new_path,'venv','bin','activate_this.py') 
execfile(activate_this, dict(__file__=activate_this)) 

from django.core.management import execute_manager 
try: 
    import settings # Assumed to be in the same directory. 
except ImportError: 
    import sys 
    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) 
    sys.exit(1) 

if __name__ == "__main__": 
    execute_manager(settings) 

Esto funciona, debido a lo estructuro mi proyectos, que tendrían que cambiar a su estructura de directorios Mis proyectos están estructurados de esta manera:.

TopLevelDir 
| 
|- Project DIR 
|- venv 
|- requirements 
|- deployment configs 
3

tengo una solución simple a este

Sólo lanzamiento manage.py desde python en el contenedor de su entorno virtual.

Así que dicen que su pitón está aquí/home/tom/ambientes/my_env/bin/python que podría lanzar manage.py así:

/home/tom/ambientes/my_env/bin/python manage.py syncdb

continuación, basta con crear un enlace simbólico al pitón del entorno virtual dentro de su proyecto de Django y llamarlo env_python entonces usted puede hacer esto:

./env_python syncdb manage.py

Cuestiones relacionadas