2011-10-11 42 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这正是我所需要的。 –