Как говорится в заголовке, я пишу библиотеку, которая содержит пакет данных с несколькими файлами конфигурации.
Файлы конфигурации содержат жестко заданные пути к другим файлам конфигурации, которые я хотел бы изменить во время установки, поэтому новые жестко запрограммированные пути будут указывать на то место, где библиотека фактически установлена.
Я пробовал разные подходы, которые хорошо работают в среде Windows, но не под платформой Unix (например, Ubuntu).
Мой код setup.py:
import atexit
import os
import sys
import fileinput
import fnmatch
import glob
from setuptools import setup
from setuptools.command.develop import develop
from setuptools.command.install import install
from setuptools.command.egg_info import egg_info
LIB_NAME = "namsim"
NAMSIM_DATA_DIRECTORY = "data"
NAMSIM_CONF_DIRECTORY = "default_namsim_conf"
def post_install_operations(lib_path):
# TODO: workaround to exit in library creation process
if 'site-packages' not in lib_path:
return
# set conf path and replace slash to backslash to support UNIX systems
conf_dir_path = os.path.join(lib_path, NAMSIM_DATA_DIRECTORY, NAMSIM_CONF_DIRECTORY)
conf_dir_path = conf_dir_path.replace(os.sep, '/')
# change paths in all conf .xml files
file_pattern = "*.xml"
for path, dirs, files in os.walk(conf_dir_path):
for filename in fnmatch.filter(files, file_pattern):
full_file_path = os.path.join(path, filename)
print(full_file_path)
# replace stub with the actual path
stub_name = 'STUB_PATH'
# Read in the file
with open(full_file_path, 'r') as file:
file_data = file.read()
print(file_data)
# Replace the target string and fix slash direction based
file_data = file_data.replace(stub_name, conf_dir_path)
print(file_data)
# Write the file out again
with open(full_file_path, 'w') as file:
file.write(file_data)
def post_install_decorator(command_subclass):
"""A decorator for classes subclassing one of the setuptools commands.
It modifies the run() method so that it will change the configuration paths.
"""
orig_run = command_subclass.run
def modified_run(self):
def find_module_path():
for p in sys.path:
if os.path.isdir(p) and LIB_NAME in os.listdir(p):
return os.path.join(p, LIB_NAME)
orig_run(self)
lib_path = find_module_path()
post_install_operations(lib_path)
command_subclass.run = modified_run
return command_subclass
@post_install_decorator
class CustomDevelopCommand(develop):
pass
@post_install_decorator
class CustomInstallCommand(install):
pass
@post_install_decorator
class CustomEggInfoCommand(egg_info):
pass
atexit.register(all_done)
setup(
name="namsim",
version="1.0.0",
author="Barak David",
license="MIT",
keywords="Name similarity mock-up library.",
packages=['namsim', 'namsim.wrapper', 'namsim.data'],
package_date={'data': ['default_namsim_conf/*']},
include_package_data=True,
cmdclass={
'develop': CustomDevelopCommand,
'install': CustomInstallCommand,
'egg_info': CustomEggInfoCommand
}
)
Изображение дерева исходных текстов моей библиотеки:
![Library source tree.](https://i.stack.imgur.com/pQvQo.jpg)
Быть ясно, оригинал namsim_config. xml оригинал содержит текст:
STUB_PATH / conf / multiplier_config. xml
Моя цель - изменить текст после установки:
{фактический путь установки lib} /conf/multiplier_config.xml
Некоторая дополнительная информация:
- I попробовал приведенный выше код на python 2.7 и 3.x платформы.
- На Windows Я получаю ожидаемый результат, в отличие от Unix платформ.
- Я использую команду "python setup.py sdist" на Windows для создания библиотеки, и я устанавливаю полученный tar.gz на разных платформах.
- Я также пытался использовать модуль atexit для изменения конфигурации до завершения процесса, но я получил тот же результат.
Спасибо.