Как получить доступ к метаданным пакета python из консоли python?
Если я построил пакет python, использующий distutils.core
, например, via
setup(
ext_package="foo",
author="me",
version="1.0",
description="foo package",
packages=["foo",],
)
куда идут все метаданные (для чего они предназначены?) и как я могу получить доступ к нему из python. В частности, как я могу получить доступ к информации об авторе из консоли python после выполнения чего-то вроде
>>> import foo
4 ответов
один из способов доступа к метаданным является использование Пип:
import pip
package = [pckg for pckg in pip.get_installed_distributions()
if pckg.project_name == 'package_name'][0]
# package var will contain some metadata: version, project_name and others.
или pkg_resources
from pkg_resources import get_distribution
pkg = get_distribution('package_name') # also contains a metadata
метаданные хранятся внутри .
когда вы создаете свой модуль, у вас должна быть эта строка:
Writing /usr/lib/python2.7/site-packages/foobar-1.0-py2.7.egg-info
этот файл содержит метаданные :
Metadata-Version: 1.0
Name: Foobar
Version: 1.0
Summary: foobar
Home-page: http://foobar.com/
Author: foobar
Author-email: foobar@foobar.net
License: UNKNOWN
Description: UNKNOWN
Platform: UNKNOWN
если вы хотите получить к нему доступ, лучший способ - с pip
или pkg_resources
(как сказал Александр Жуков)
ex:
>>> import pkg_resources
>>> d = pkg_resources.get_distribution('Foobar')
>>> d.version
'1.0'
>>> d.location
'/usr/lib/python2.7/site-packages'
одно использование этих данных заключается в том, что оно отображается на Pypi (http://pypi.python.org/) Если вы должны были опубликовать свой пакет там. Один из способов структурировать это так:
в верхнем уровне вашего foo
модуль:
__author__= "me"
__version__= "1.0"
__description__= "foo package"
на setup.py
:
import foo
setup(
author = foo.__author__,
version = foo.__version__,
description = foo.__description__,
packages = ["foo",],
)
таким образом, вам нужно обновить метаданные только в одном месте, и поскольку данные определены в главном модуле ваших пакетов, они будут доступны оттуда.
дано setup.py
следующим образом:
from distutils.core import setup
setup(
name = 'TestApp',
version = '0.0.1',
author = 'saaj',
py_modules = ['app'],
test_suite = 'test'
)
для некоторых сценариев и автоматизации без установки пакета, где pip
, easy_install
и даже setuptools
не предоставляйте параметры командной строки или общедоступные API для чтения всех метаданных (например,test_suite
), вот это немного hacky образом:
python3 -c "import sys, types; m = types.ModuleType('distutils.core'); \
m.setup = lambda **kwargs: print(kwargs); \
sys.modules['distutils.core'] = m; import setup"
это печати dict
аргументов ключевых слов, переданных в setup()
.
{'author': 'saaj', 'version': '0.0.1', 'name': 'TestApp',
'test_suite': 'test', 'py_modules': ['app']}
вы можете заменить print
на lambda
что выход нужно. Если ваш setup.py
импорт setup()
С setuptools
, что на самом деле рекомендуется, просто замените "distutils.core " с "setuptools"в фрагменте.
отформатированный фрагмент следующим образом:
import sys
import types
m = types.ModuleType('distutils.core')
m.setup = lambda **kwargs: print(kwargs)
sys.modules['distutils.core'] = m
import setup # import you setup.py with mocked setup()