Пакет только бинарные скомпилированные .so файлы библиотеки python, скомпилированные с Cython

У меня есть пакет с именем mypack внутри которого есть модуль mymod.py и __init__.py . По какой-то причине это не обсуждается, мне нужно скомпилировать этот модуль, скомпилированный (и не разрешены файлы .py или .pyc). То есть __init__.py является единственным исходным файлом, разрешенным в распределенном сжатом файле.

Структура папок:

 . │ ├── mypack │ ├── __init__.py │ └── mymod.py ├── setup.py 

Я нахожу, что Cython может это сделать, конвертируя каждый .py-файл в библиотеку .so, которую можно напрямую импортировать с помощью python.

Вопрос в том, как должен быть файл setup.py для обеспечения простой упаковки и установки?

Целевая система имеет virtualenv, где пакет должен быть установлен любым способом, который позволяет легко устанавливать и удалять (easy_install, pip и т. Д. Все приветствуются).

Я попробовал все, что было в моих силах. Я читал документацию setuptools и distutils , все связанные с stackoverflow вопросы и пытался со всеми типами команд (sdist, bdist, bdist_egg и т. Д.) С множеством комбинаций файлов setup.cfg и MANIFEST.in.

Самое близкое, что я получил, было с приведенным ниже установочным файлом, который подклассифицировал команду bdist_egg, чтобы удалить также .pyc-файлы, но это нарушает установку.

Решение, которое устанавливает «вручную» файлы в venv, также хорошо, при условии, что все вспомогательные файлы, включенные в правильную установку, будут покрыты (мне нужно запустить pp pip freeze в venv и увидеть mymod==0.0.1 ).

Запустите его с помощью:

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

и (попробуйте) установить его с помощью

 easy_install mymod-0.0.1-py2.7-linux-x86_64.egg 

Как вы можете заметить, целью является 64-разрядная версия Linux с помощью python 2.7.

 from Cython.Distutils import build_ext from setuptools import setup, find_packages from setuptools.extension import Extension from setuptools.command import bdist_egg from setuptools.command.bdist_egg import walk_egg, log import os class my_bdist_egg(bdist_egg.bdist_egg): def zap_pyfiles(self): log.info("Removing .py files from temporary directory") for base, dirs, files in walk_egg(self.bdist_dir): for name in files: if not name.endswith('__init__.py'): if name.endswith('.py') or name.endswith('.pyc'): # original 'if' only has name.endswith('.py') path = os.path.join(base, name) log.info("Deleting %s",path) os.unlink(path) ext_modules=[ Extension("mypack.mymod", ["mypack/mymod.py"]), ] setup( name = 'mypack', cmdclass = {'build_ext': build_ext, 'bdist_egg': my_bdist_egg }, ext_modules = ext_modules, version='0.0.1', description='This is mypack compiled lib', author='Myself', packages=['mypack'], ) 

2 Solutions collect form web for “Пакет только бинарные скомпилированные .so файлы библиотеки python, скомпилированные с Cython”

Это была именно та проблема, для которой был разработан формат колес Python, описанный в PEP 427 .

Колеса являются заменой для яиц Python (которые были / являются проблематичными по целому ряду причин) – они поддерживаются pip , могут содержать частные двоичные файлы, специфичные для архитектуры (вот один пример такого соглашения ) и принимаются вообще Python сообщества, которые имеют доли в таких вещах.

Вот один фрагмент setup.py из статьи Python on Wheels , в которой показано, как настроить бинарный дистрибутив:

 import os from setuptools import setup from setuptools.dist import Distribution class BinaryDistribution(Distribution): def is_pure(self): return False setup( ..., include_package_data=True, distclass=BinaryDistribution, ) 

… в leu более старых (но, возможно, так или иначе канонически поддерживаемых) классов setuptools которые вы используете. Очень просто сделать Колеса для ваших целей распространения, как указано – как я помню из опыта, процесс сборки wheel модулей несколько осознает virtualenv , или он очень прост в использовании одного в другом.

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

Я предлагаю вам использовать формат колеса (как предложено fish2000). Затем в setup.py установите аргумент packages в [] . Расширение Cython все равно будет построено, и полученные файлы .so будут включены в итоговый пакет колес.

Если ваш __init__.py не включен в колесо, вы можете переопределить метод build_ext класса build_ext отправленный Cython, и скопировать файл из исходного дерева в папку сборки (путь можно найти в self.build_lib ).

Python - лучший язык программирования в мире.