2010-08-24 16 views
6

Il mio problema è ottenere get manage.py syncdb per l'esecuzione in un virtualenv.Django non trova app in virtualenv quando si utilizza manage.py syncdb

Stava funzionando bene a un certo punto, ma sembra essersi rotto qualche volta quando ho installato South e aggiornato pip e distribuito.

In ogni caso, quando viene attivato il virtualenv, posso importare le app bene nell'interprete interattivo. Eseguendo mod_wsgi, anche le app vengono importate e il sito può essere eseguito.

Quando eseguo manage.py syncdb, non riesce a trovare alcuna app in INSTALLED_APPS che si trova nella mia virtualenv. Raccoglie le app installate dal sistema, ma non riesce quando tenta di importare solo le app virtualenv.

+1

Quali sono i contenuti della baracca linea nella parte superiore di manage.py in esecuzione? Quali sono i comandi esatti che usi per eseguire l'interprete interattivo Python e manage.py quando il tuo virtualenv è attivato? –

risposta

5

Ciao Questa è una vecchia domanda, ma non è stata data risposta. Non sei sicuro di quello che si sta tentando di fare, ma ci sono fondamentalmente due modi è possibile utilizzare virtualenv,

  1. per lo sviluppo, per creare ambienti self-contained
  2. Per la distribuzione, per creare ambienti self-contained

Nel primo caso, è necessario prima Attivare il virtualenv con source venv/bin/activate, per quando viene distribuito, è necessario assicurarsi che il virtualenv sia attivato per il codice del sito web. Personalmente preferisco il seguente approccio per garantire che il tuo percorso sia impostato correttamente. (Ho anche aggiungere questo al mio manage.py quando si fa lo sviluppo, così io non devono preoccuparsi di attivare l'ambiente prima.

manage.py Modificato

#!/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) 

Questo funziona, a causa di come I Struttura mia progetti, si dovrebbe cambiare per la struttura di directory I miei progetti sono strutturati in questo modo:.

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

ho una semplice soluzione a questo

Proprio lancio manage.py dal python nel cestino del tuo ambiente virtuale.

Così che il vostro pitone è qui/home/tom/ambienti/my_env/bin/python si potrebbe lanciare manage.py in questo modo:

/home/tom/ambienti/my_env/bin/python manage.py syncDB

poi basta creare un link simbolico a pitone del ambiente virtuale all'interno del vostro progetto di Django e chiamarlo env_python allora si può fare questo:

./env_python syncdb manage.py