2017-01-19 10 views
3

У меня есть небольшой проект python2/3 со структурой каталоговГде разместить метаинформацию (__version__ и т. Д.) В проекте Python?

superproject/ 
    -> __init__.py 
    -> meta.py 
setup.py 

Файл __init__.py содержит кучу import с и фактическим кодом, мета имеет

__author__ = 'John Doe' 
__author_email__ = '[email protected]' 
__version__ = '1.2.3' 
# [...] 

Я хотел бы сделать мета-информация доступна в файле setup.py (простой: только import superproject.meta) и в superproject как

import superproject 
print(superproject.__version__) 

Я борюсь с последним требованием. При выполнении

from .meta import * 

в __init__.py, я могу сделать только

print(superproject.meta.__version__) 

, например.

Обратите внимание, что я не могу поставить мета данные в __init__.py непосредственно, так как я должен был бы import superproject в setup.py, а также многочисленные import зависимости от superproject не доступны тогда еще.

Любые подсказки?

+1

Дополнительные опции для этой, по-видимому, неразрешимой проблемы: https://packaging.python.org/single_source_version/ – jwodder

+0

@jwodder Именно то, что я искал. Если вы продвинете это для ответа, я буду рад отметить это решение. –

+0

см. Также [bumpversion] (https://pypi.python.org/pypi/bumpversion) – user25064

ответ

1

Это известная проблема, и Фонд Python Software имеет целую статью об этом: Single-sourcing the Project Version.

Я играл со всеми предложениями и в конечном итоге решил следующее решение.

  1. Переименовать meta.py в __about__.py и from ... import ... его в __init__.py.
  2. В setup.py, exec__about__.py в словарь и использовать эту информацию.

Эта информация содержит все метаинформацию как superproject.__about__.__version__, а также superproject.__version__. Кроме того, это облегчает получение информации из других подмодулей superproject.

В то время как он добавляет немного сложности к setup.py, он оставляет фактический код проекта в значительной степени нетронутым. Мне все равно, насколько сложно получить setup.py, если он удаленно обслуживаем.

0

Вы можете сделать

import importlib 

meta = importlib.import_module ("mod.meta") 
print (meta.__author__) 
+1

Можете ли вы быть немного более подробным? Я не понимаю, как это еще помогает. –

+0

Я думал, что вас интересует setup.py, поэтому этот фрагмент принадлежит. Вам нужно получить доступ к метаданным из остальной части вашего проекта? –

+0

Это было бы неплохо, но не строгое требование. –

0

Вы можете прочитать из файла в корневом каталоге проекта. Включите этот файл в data_files в setup.pydocs. JSON, вероятно, самый простой формат для использования.

как в

superproject/ 
    -> __init__.py 
setup.py 
meta.json 
+0

Как сделать информацию доступной в установке как «суперпроект .__ version__»? –

+0

прочитайте файл json и установите переменную, выполните то же самое в файле setup.py – user25064