2013-10-20 179 views
10

使用Django模型今天我感到很困惑。外部python腳本

我試圖用我的Django應用程序模型在我的Python腳本。

這裏是我的方法

import os, sys 

sys.path.append("/var/www/cloudloon/horizon") 
os.environ["DJANGO_SETTINGS_MODULE"] = "openstack_dashboard.settings" 
from django.contrib.auth.models import User 

我很困惑,爲什麼它給我

ImportError: Could not import settings 'openstack_dashboard.settings' (Is it on sys.path?): cannot import name auth 

經審查,我創建了一個名爲creds AA文件,其中包括

export PYTHONPATH=$PYTHONPATH:/var/www/cloudloon/horizon/; 
export DJANGO_SETTINGS_MODULE=openstack_dashboard.settings; django-admin.py shell; 

,並從終端窗口信用檔案所在地,我做

source creds 

,並從django-admin.py殼,我可以導入我的任何Django應用程序模型中沒有任何錯誤。

爲什麼不能在我的python腳本工作?

我與Django的做,我需要做的是建立一個Python守護程序腳本,將訪問我的Django應用程序模型。

我跟在Ubuntu 12.04有Django的1.5

當我尋找解決辦法的工作,我這樣做:

import os, sys 

sys.path.append("/var/www/cloudloon/horizon") 
sys.path.append("/var/www/cloudloon/horizon/openstack_dashboard") 
# os.environ["DJANGO_SETTINGS_MODULE"] = "settings" 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", 
          "openstack_dashboard.settings") 

print os.environ["DJANGO_SETTINGS_MODULE"] 
for s in sys.path: 
    print s 

from django.contrib.auth.models import User 

繼承人的輸出:http://paste.openstack.org/show/48787/

,你可以看到, settings.py所在的目錄存在於我的sys.path中,但它仍然無法導入openstack_dashboard.settings。

謝謝大家。

回答

8

應該工作提供了下面的腳本項目的佈局(和路徑設置文件)是這樣的:

/var/www/cloudloon/horizon/openstack_dashboard/settings.py

#!/usr/bin/env python 
import os, sys 

sys.path.append("/var/www/cloudloon/horizon") 
os.environ["DJANGO_SETTINGS_MODULE"] = "openstack_dashboard.settings" 
from django.contrib.auth.models import User 

我相信你所看到的問題是由於您項目的安排,或者您需要將其他目錄級別追加到腳本中的sys.path調用中。

編輯:

看你的github上的項目,horizonopenstack_dashboard在同一個目錄級別。什麼你想要做的是設置你的sys.path到一個更高的水平:

sys.path.append("/var/www/cloudloon") 
+0

管理命令似乎沒有什麼,我想創建一個好主意。我需要創建python-daemon腳本。基本上,要運行python-daemon腳本,我需要運行「python myscript.py run」。 Python管理命令不適合它。 –

+0

使用上面的代碼,它給了我AttributeError的:「海峽」對象有沒有屬性「__file__」 –

+0

@DjangoBot對不起,該setup_environ需要一個模塊對象,而不是字符串。我已更正了代碼段。 –

23

你需要的,而不是做這些奇怪的雜技寫custom management command

創建模塊叫管理(換句話說,創建一個目錄management和裏面創建一個空__init__.py文件),您在INSTALLED_APPS中列出的任何應用程序的目錄中。所以,如果你有myapp,您將創建:

myapp 
| 
> management 
| | __init__.py 
> models.py 
> views.py 

然後在管理目錄中,創建另一個模塊commands並在其中創建一個文件,該文件是你的命令的名稱;例如my_command.py,就像這樣:

myapp 
| 
> management 
| | __init__.py 
| | commands 
| | | __init__.py 
| | | my_command.py 
> models.py 
> views.py 

my_command.py,寫這個樣板代碼:

from django.core.management.base import BaseCommand, CommandError 
from myapp.models import MyModel 

class Command(BaseCommand): 
    help = 'Does some magical work' 

    def handle(self, *args, **options): 
     """ Do your work here """ 
     self.stdout.write('There are {} things!'.format(MyModel.objects.count())) 

一旦保存文件,你就能夠做到,它可以訪問所有您的模型和設置。

如果您需要將它作爲守護程序運行,Daniel Roseman寫道django-initd這正是如此。一旦你已經安裝了它:

from django.core.management.base import CommandError 
from daemon_command import DaemonCommand 
from myapp.models import MyModel 

class Command(DaemonCommand): 
    help = 'Does some magical work' 

    def loop_callback(self, *args, **options): 
     """ Do your work here """ 
     self.stdout.write('There are {} things!'.format(MyModel.objects.count())) 

一旦你已經做完這些from the github readme

The important parts of such a process are these: 

    * it comes up automatically on server startup 
    * it logs errors and information to a named location, which is configurable 
    * if the process dies, it restarts itself straight away 

[...] 

Run the command as normal, but pass one of --start, --stop or --restart to 
work as a daemon. Otherwise, the command will run as a standard application. 
+0

我有這個作爲以前的答案,但腳本應該是一個守護進程,不是一勞永逸關命令。 –

+0

用python-daemon來實現似乎太困難了。 –

+0

好的回答,不知道django-initd。這是OP應該如何做的,但我認爲OP有路徑問題。 –