2010-08-24 3 views
6

Mein Problem ist es, manage.py syncdb innerhalb eines virtualenv laufen zu bekommen.Django nicht finden Apps in virtualenv bei der Verwendung von manage.py syncdb

Es funktionierte an einem Punkt gut, aber scheint irgendwann irgendwann gebrochen zu haben, als ich South installiert habe und Pip aktualisiert und verteilt habe.

Wie auch immer, wenn der virtualenv aktiviert ist, kann ich Anwendungen innerhalb des interaktiven Interpreters gut importieren. Durch das Ausführen von mod_wsgi werden die Apps ebenfalls importiert und die Site kann ausgeführt werden.

Wenn ich manage.py syncdb ausführen, findet es keine App in INSTALLED_APPS, die in meinem virtualenv ist. Es greift auf systeminstallierte Apps zu, schlägt jedoch fehl, wenn es versucht, nur Apps von virtualenv zu importieren.

+1

Was den Inhalt des shebang sind Zeile an der Spitze der von Ihnen ausgeführten manage.py? Was sind die genauen Befehle, die Sie verwenden, um den interaktiven Interpreter von Python und manage.py auszuführen, wenn Ihr virtualenv aktiviert ist? –

Antwort

5

Hallo Das ist eine alte Frage, aber sah, dass sie nicht beantwortet wird. Nicht sicher, was Sie zu tun versuchen, aber es gibt im Grunde zwei Modi, die Sie verwenden virtualenv können,

  1. Für die Entwicklung, in sich geschlossene Umgebungen
  2. Für den Einsatz zu schaffen, zu schaffen sich geschlossene Umgebungen

Im ersten Fall müssen Sie zuerst Ihren virtualenv mit dem Quellcode venv/bin/activate aktivieren. Wenn Sie ihn bereitstellen, müssen Sie sicherstellen, dass der virtualenv für Ihren Website-Code aktiviert ist. Persönlich bevorzuge ich den folgenden Ansatz, um sicherzustellen, dass Ihr Pfad korrekt eingestellt ist. (Ich füge dies auch für meine manage.py beim Ausführen einer Entwicklung, so dass ich keine Sorge muss zuerst die Umgebung zu aktivieren.

Modified manage.py

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

Dies funktioniert, darauf zurückzuführen, wie ich meine Struktur Projekte, würden Sie es zu Ihrer Verzeichnisstruktur ändern müssen Meine Projekte strukturiert sind wie folgt:.

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

ich eine einfache Lösung für diesen

Gerade Start habe manage.py aus dem Python im Bin Ihrer virtuellen Umgebung.

sagen also Ihre Python hier ist/home/tom/Umgebungen/meine_umgeb/bin/python könnten Sie starten manage.py wie so:

/home/tom/Umgebungen/meine_umgeb/bin/python manage.py syncdb

dann erstellen Sie einfach einen symbolischen Link auf die python virtuellen Umgebung in Ihrem django Projekt und nennen es env_python dann können Sie dies tun:

./env_python manage.py syncdb

Verwandte Themen