Исключить один исходный файл из Python bdist_egg или bdist_wheel - PullRequest
0 голосов
/ 24 мая 2018

Справочная информация: у меня есть один исходный файл, который отвечает за безопасность.Здесь есть магические ключи и специальные алгоритмы.

Можно ли удалить этот единственный исходный файл из пакета с яйцом или колесом питона?команда.

python setup.py bdist_egg --exclude-source-files

Редактировать структуру проекта:

├── setup.py
├── src
|   ├── __init__.py
|   ├── file1.py
|   ├── file2.py
|   ├── file_to_exclude.py

Спасибо за помощь!

1 Ответ

0 голосов
/ 24 мая 2018

К сожалению, ни distutils, ни setuptools не дают возможности исключить отдельные модули, поэтому вам придется обходить его.

Обновление:

Я описал лучшее решение здесь , который имитирует исключение пакета setuptools в find_packages().Вам придется переопределить команду build_py в сценарии установки, которая может принимать список шаблонов исключения, такой же, как список exclude в find_packages.В вашем случае это будет:

import fnmatch
from setuptools import find_packages, setup
from setuptools.command.build_py import build_py as build_py_orig


exclude = ['src.file_to_exclude']


class build_py(build_py_orig):

    def find_package_modules(self, package, package_dir):
        modules = super().find_package_modules(package, package_dir)
        return [(pkg, mod, file, ) for (pkg, mod, file, ) in modules
                if not any(fnmatch.fnmatchcase(pkg + '.' + mod, pat=pattern)
                for pattern in exclude)]


setup(
    ...,
    packages=find_packages(),
    cmdclass={'build_py': build_py},
)

Я считаю, что это гораздо более мощное и distutils -конформное решение, чем приведенные ниже.Он также позволяет исключить несколько модулей с помощью подстановочных знаков, например,

exclude = ['src.file*']

исключит все модули, начинающиеся с file в пакете src, или

exclude = ['*.file1']

исключитfile1.py во всех пакетах.

Оригинальный ответ

положить модули для исключения в отдельный пакет

Вы можете использовать тот факт, что setuptools может исключать пакеты (dirsсодержащий файлы __init__.py), но это потребует некоторого рефакторинга.Создайте package_to_exclude, поместите туда file_to_exclude.py и исправьте все возможные ошибки импорта:

project
├── setup.py
└── src
     ├── __init__.py
     ├── file1.py
     ├── file2.py
     └── package_to_exclude
          ├── __init__.py
          └── file_to_exclude.py

Теперь вы можете исключить package_to_exclude в сценарии установки:

from setuptools import find_packages, setup

setup(
    ...,
    packages=find_packages(exclude=['src.package_to_exclude'])
)

исключить пакет, добавить модули для включения через py_modules

Если вы не можете или не хотите перемещать модуль в отдельный пакет, вы можете исключить пакет src и добавить все модулив src кроме file_to_exclude в py_modules.Пример:

import os
from setuptools import find_packages, setup

excluded_files = ['file_to_exclude.py']
included_modules = ['src.' + os.path.splitext(f)[0]
                    for f in os.listdir('src')
                    if f not in excluded_files]

setup(
    ...,
    packages=find_packages(exclude=['src']),
    py_modules=included_modules,
)
...