Экземпляры Python / Django - PullRequest
0 голосов
/ 11 октября 2011

Скажем, я хочу напечатать все мои установленные приложения с информацией о версии при запуске сервера .. У меня есть эта настройка:

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

main init file

import settings

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

app init file (s)

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

Я попал в оператор pass ... Я полагаю, это потому, что экземпляры работают в 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)

Ответы [ 2 ]

2 голосов
/ 11 октября 2011

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)
1 голос
/ 11 октября 2011

Вот в чем дело - settings.INSTALLED_APPS - это кортеж строк. import оператор не может ничего с этим поделать. Для этого вам необходимо использовать функцию __import__() .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...