2011-10-11 41 views
0

說我要打印我的所有安裝的應用程序在服務器啓動時的版本信息。我有這樣的設置:Python的實例/ Django的

Project 
    /app-one 
     __init__.py 
     otherstuff 
    /app-two 
     __init__.py 
     otherstuff 
    /__init__.py 
    /admin.py 
    /urls.py 
    /settings.py 

主要初始化文件

import settings 

if settings.DEBUG: 
     for app in settings.INSTALLED_APPS: 
         try: 
             import app 
             print getattr(app, '__version__', None) 
         except Exception: 
             pass 

應用init file(s)

__version_info__ = ('0', '0', '1') 
__version__ = '.'.join(__version_info__) 

我進入通行證聲明..我想這是因爲方式實例工作在Python中,但我將如何解決它?

這個工程雖然:

import app 
getattr(app, '__version__', None) 

這個固定:

import settings 

if settings.DEBUG: 
    for app in settings.INSTALLED_APPS: 
     app = __import__(app) 
     print getattr(app, '__version__', None) 
+0

嘗試添加打印語句以確保app init先運行。 –

+0

至少刪除異常處理,看看錯誤是什麼 – akonsu

+0

ImportError:沒有名爲app的模塊...似乎你不能導入一個變量,直到運行時才知道? –

回答

2

app你的循環不是一個模塊,而是一個字符串。要按名稱加載模塊,您必須使用django.utils.importlib.import_module功能:

from django.conf import settings 
from django.utils.importlib import import_module 

for app in settings.INSTALLED_APPS: 
    app_module = import_module(app) 
    print getattr(app_module, '__version__', None) 
+0

我以前沒有見過這個 - 這是首選嗎?看看代碼,除了調用'__import__'之外,似乎沒有太多的工作。我注意到它來自[Python 2.7的importlib](http://docs.python.org/release/2.7/library/importlib.html) - 這個建議只是爲了幫助從Python <2.7過渡到Python 3嗎? – Nate

+1

如果您需要訪問導入的模塊,則會優先使用import_module()。使用'__import__'從模塊中加載模塊時有一個小問題。請閱讀http://bugs.python.org/issue9254 – catavaran

+0

的消息,這是一個很好的理由。 +1 – Nate

1

這裏的東西 - settings.INSTALLED_APPS是一個字符串元組。 import聲明無法做到這一點。要做到這一點,你需要使用__import__() function

+0

ty這正是我所需要的。 –