К сожалению, ни 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,
)