2010-02-03 20 views
24

Probleme mit dem Django benutzerdefinierte Befehle zu arbeiten.django benutzerdefinierte Befehl nicht gefunden

Von django documetation ist

from django.core.management.base import NoArgsCommand 

class Command(NoArgsCommand): 
    def handle_noargs(self, **options): 
     print 'Doing task...' 
     # invoke the functions you need to run on your project here 
     print 'Done' 

wenn lief

python manage.py myapp_task 

bekommen Fehler

application/ 
    manage.py 
    blog/ 
     __init__.py 
     models.py 
     management/ 
      __init__.py 
      commands/ 
       __init__.py 
       myapp_task.py 
     views.py 

myapp_task.py Inhalt platziert haben

Unknown command: 'myapp_task' 

Antwort

35

Die Verzeichnisstruktur in Ihrer Antwort ist ein wenig mehrdeutig; wenn die Dateien platzieren wie folgt django sollten in der Lage sein, Ihren Befehl zu finden:

project/ # in your question this would be 'application' 
    manage.py 
    blog/ 
     __init__.py 
     models.py 
     management/ 
      __init__.py 
      commands/ 
       __init__.py 
       myapp_task.py 
     views.py 

Darüber hinaus müssen Sie Ihre App in Ihrem settings.py aktivieren:

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.admin', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'blog', # <= your app here ... 
) 
+0

die Dateistruktur korrekt ist, bekam Einfügen es hier nur vermasselt – bocca

+0

ist es in installierten Anwendungen in Einstellungen – bocca

+0

Bocca aufgeführt: Können Sie das Einrücken in der Liste der Dateien in der ursprünglichen Nachricht zu beheben, dann ? Die tatsächliche Struktur ist in diesem Fall sehr wichtig. –

0

Ich denke, Befehle/muss in der Verwaltung/Verzeichnis sein.

+0

Befehle Verzeichnis ist in Management – bocca

3

Ich hatte das gleiche Problem. Der Grund war, dass das Projekt root nicht in meinem $ PYTHONPATH war. Die Lösung ist in diesem Fall (auf einer Linux-Maschine) so etwas wie

PYTHONPATH=./project python manage.py myapp_task 
0

eingeben Wenn das Projekt Byte-kompiliert ist, django.core.management.find_commands() sieht nur für Py-Dateien. Wenn Ihre benutzerdefinierte Befehle in .pyc Dateien sind, müssen Sie django/core/Management/Befehle/__ init__.py mit dem Patch auf https://code.djangoproject.com/ticket/19085

-1

Es ist, weil die init .pyc nicht automatisch innerhalb "erstellt bekommen Patch Management "und" Befehle "Ordner. Kopieren Sie your_app/__init__.py und your_app/__init__.pyc und fügen Sie sie in den Ordner management/and commands/ein.

+0

Ist das nicht ein schrecklicher Hack? Warum sollte man sich darum kümmern müssen, ob .pyc's existieren? Ist es nicht der Job von python2 | 3 zu kompilieren, und sollte Runtime Introspection oder was auch immer der django-admin tut, um Befehle zu finden, invariant sein, ob .pyc's existieren? – Herbert