Просто и понятно, создайте файл с именем source/package_name/version.py
со следующим содержимым:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
__version__ = "2.6.9"
Затем в вашем файле source/package_name/__init__.py
вы импортируете версию для использования другими людьми:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from .version import __version__
Теперь вы можете поставить это на setup.py
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import re
import sys
try:
filepath = 'source/package_name/version.py'
version_file = open( filepath )
__version__ ,= re.findall( '__version__ = "(.*)"', version_file.read() )
except Exception as error:
__version__ = "0.0.1"
sys.stderr.write( "Warning: Could not open '%s' due %s\n" % ( filepath, error ) )
finally:
version_file.close()
Протестировано с Python 2.7
, 3.3
, 3.4
, 3.5
, 3.6
и 3.7
в Linux, Windows и Mac OS. Я использовал пакет, в котором есть Интеграция и Модульные тесты для всех этих платформ. Вы можете увидеть результаты .travis.yml
и appveyor.yml
здесь:
- https://travis -ci.org / evandrocoan / debugtools / сборки / 527110800
- https://ci.appveyor.com/project/evandrocoan/pythondebugtools/builds/24245446
Альтернативная версия использует менеджер контекста:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import re
import sys
try:
filepath = 'source/package_name/version.py'
with open( filepath ) as file:
__version__ ,= re.findall( '__version__ = "(.*)"', file.read() )
except Exception as error:
__version__ = "0.0.1"
sys.stderr.write( "Warning: Could not open '%s' due %s\n" % ( filepath, error ) )
Вы также можете использовать модуль codecs
для обработки ошибок Unicode как на Python 2.7
, так и 3.6
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import re
import sys
import codecs
try:
filepath = 'source/package_name/version.py'
with codecs.open( filepath, 'r', errors='ignore' ) as file:
__version__ ,= re.findall( '__version__ = "(.*)"', file.read() )
except Exception as error:
__version__ = "0.0.1"
sys.stderr.write( "Warning: Could not open '%s' due %s\n" % ( filepath, error ) )
Если вы пишете модуль Python на 100% на C / C ++ с использованием расширений Python C, вы можете сделать то же самое, но с использованием C / C ++ вместо Python.
В этом случае создайте следующее setup.py
:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import re
import sys
import codecs
from setuptools import setup, Extension
try:
filepath = 'source/version.h'
with codecs.open( filepath, 'r', errors='ignore' ) as file:
__version__ ,= re.findall( '__version__ = "(.*)"', file.read() )
except Exception as error:
__version__ = "0.0.1"
sys.stderr.write( "Warning: Could not open '%s' due %s\n" % ( filepath, error ) )
setup(
name = 'package_name',
version = __version__,
package_data = {
'': [ '**.txt', '**.md', '**.py', '**.h', '**.hpp', '**.c', '**.cpp' ],
},
ext_modules = [
Extension(
name = 'package_name',
sources = [
'source/file.cpp',
],
include_dirs = ['source'],
)
],
)
Который читает версию из файла version.h
:
const char* __version__ = "1.0.12";
Но не забудьте создать MANIFEST.in
для включения файла version.h
:
include README.md
include LICENSE.txt
recursive-include source *.h
И он интегрирован в основное приложение с:
#include <Python.h>
#include "version.h"
// create the module
PyMODINIT_FUNC PyInit_package_name(void)
{
PyObject* thismodule;
...
// https://docs.python.org/3/c-api/arg.html#c.Py_BuildValue
PyObject_SetAttrString( thismodule, "__version__", Py_BuildValue( "s", __version__ ) );
...
}
Ссылки
- Ошибка открытия файла Python
- Определение глобала в модуле Python из C API
- Как включить данные пакета в setuptools /ести?
- https://github.com/lark-parser/lark/blob/master/setup.py#L4
- Как использовать пакеты setuptools и ext_modules с одинаковым именем?
- Можно ли включить подкаталоги, используя dist utils (setup.py), как часть данных пакета?