Libseccomp: RFE: disponibilizar as ligações Python via pip

Criado em 24 dez. 2016  ·  9Comentários  ·  Fonte: seccomp/libseccomp

enhancement prioritlow

Todos 9 comentários

Vou considerar isso, mas considero isso uma prioridade extremamente baixa no momento (isso sempre pode mudar).

Para referência futura, documentação Python sobre empacotamento / distribuição de código:

Obrigado @pcmoore pelos comentários sobre os PRs. Eu esperava ajudar no empacotamento das ligações Python e comecei a pesquisar isso ontem à noite.

Algumas das soluções rápidas foram adicionar o MANIFEST.in e atualizar os arquivos setup.py. Consegui fazer com que o setup.py atualizado funcionasse com pip install , mas com certeza precisa de mais trabalho para realmente funcionar com a versão de desenvolvimento (ainda não investiguei a falha do # 217, mas talvez em breve )

IMO, faria sentido separar as ligações do Python em um repositório separado para um melhor fluxo de trabalho de desenvolvimento / teste / lançamento. Eu trabalhei em projetos Python, mas não muito em Cythonized, mas estou feliz em ajudar em tudo que posso.

Eu esperava ajudar na configuração dos documentos depois de corrigir # 61 (que provavelmente seria simplificado se movermos isso para um novo repositório, embora, idk como sphinx a ferramenta de documentação Python lida com arquivos cython).

Do comentário de @pcmoore na edição nº 216:

Basicamente, precisamos decidir se queremos continuar a oferecer suporte aos vínculos Python como parte da distribuição principal do código-fonte libseccomp ou se queremos dividi-los como fazemos para os vínculos golang.

Gosto da ideia de separar os vínculos python do pacote libseccomp principal e também concordo que é uma prioridade relativamente baixa para mim. Se outra pessoa estiver interessada em retomar o trabalho, eu ficaria feliz em ajudar a revisá-lo :).

BTW, eu concordo que as ligações Python devem estar em um repositório separado. Embora eu não seja voluntário. : ^)

Se alguém com permissão para criar um novo repo na seccomp org puder configurá-lo, posso retirar as ligações Python do repo e criar um PR.

Existem algumas mudanças que prevejo:

  • Use ferramentas de compilação nativas do Python, setup.py build deve ser suficiente
  • Os números de versão podem ser codificados permanentemente em setup.py ou ser obtidos a partir de tags git (usando o pacote setuptools-scm) se necessário.
  • Vinculação dinâmica ao libseccomp principal em vez de vinculação estática. (Já proposto em # 217)

Eu não olhei muito para testar o chicote para ver se há uma boa maneira de portá-los para usar testes nativos de python por meio de estruturas de teste de estilo pytest ou nose2 .

Finalmente, alguma documentação adicional para construir pacotes de distribuição tanto de fonte quanto de distribuição binária.

Vou marcar provisoriamente isso para v2.6, o que na verdade significa apenas "algum tempo depois de lançarmos a v2.5". Concluir a v2.5 é nossa prioridade agora, podemos revisitar esse problema mais tarde.

Tornar libseccomp pip-installable seria muito útil para mim também. Aqui está meu trabalho amador em torno de make / poetry / docker (e patching setup.py) se alguém mais estiver tentando descobrir isso. Eu também ajustei / defini parâmetros de construção para que não exigisse sudo.

build-seccomp / setup.py (ligeiramente modificado /src/python/setup.py ):

# OLD IMPORTS
# -----------------------------------------
# import os 
# 
# from distutils.core import setup
# from distutils.extension import Extension
# from Cython.Distutils import build_ext
# -----------------------------------------

# Replace with these NEW IMPORTS
# -----------------------------------------
import os

from setuptools import setup, Extension
from Cython.Distutils import build_ext
# -----------------------------------------

# rest of the file unmodified...

Makefile :

.ONESHELL: install-libseccomp-native install-libseccomp-deps install-libseccomp build-whl-libseccomp

SECCOMP_BUILD_ENV = VERSION_RELEASE="0.0.0" \
                    CPPFLAGS="-I ../../include " \
                    CFLAGS="-Wall -g -O2" \
                    LDFLAGS="-Wl,-z -Wl,relro "
WHEEL_DIR = $(CURDIR)/dist

install-libseccomp-native:
ifeq (,$(wildcard libseccomp/.)) # If already cloned/built ignore
    git clone https://github.com/seccomp/libseccomp.git --branch v2.4.3 --depth 1
    cp build-seccomp/setup.py libseccomp/src/python/setup.py
    cd libseccomp
    ./autogen.sh
    ./configure --prefix=$(CURDIR)/libseccomp/build-aux
    make install
endif

install-deps:
    poetry install --no-root

# `make install-libseccomp` will install seccomp library into poetry virtual environment.
# this is a good option for local development
install-libseccomp: install-libseccomp-native install-deps
    cd libseccomp/src/python
    export $(SECCOMP_BUILD_ENV)
    poetry run python setup.py install

# `make build-whl-libseccomp` will create a .whl file for the seccomp library
# this is a good option for generating a build artifact in CI/CD or Docker
build-whl-libseccomp: install-libseccomp-native install-deps
    cd libseccomp/src/python
    export $(SECCOMP_BUILD_ENV)
    poetry run python setup.py bdist_wheel --dist-dir=$(WHEEL_DIR)

build-docker:
    docker build -t libseccomp-python .

run-docker:
    docker run --env SOME_VAR_1=42 --env SOME_VAR_2="Hello, World!" libseccomp-python

Dockerfile (tenho uma versão equivalente, mas mais feia / mais amigável de cache em meu aplicativo):

# ============= BUILD STAGE ============= #
FROM python:3.8.3-buster as builder

# Install poetry
RUN pip install "poetry==1.0.5"

# Build/install wheels
WORKDIR /app
COPY pyproject.toml poetry.lock Makefile ./
COPY build-seccomp ./build-seccomp
RUN make build-whl-libseccomp

# ========== FINAL IMAGE STAGE ========== #
FROM python:3.8.3-slim-buster

# Install application
COPY --from=builder /app/dist /app/dist
WORKDIR /app
RUN pip install --no-index --find-links dist seccomp
COPY app ./app

# Configure
ENV SOME_VAR_1=
ENV SOME_VAR_2=

# Run the application
CMD ["python", "app/main.py"]

pyproject.toml :

[tool.poetry]
name = "libseccomp-demo"
version = "0.1.0"
description = "Building libseccomp for Python projects."
authors = ["Han Solo"]

[tool.poetry.dependencies]
python = "^3.8"

[tool.poetry.dev-dependencies]
cython = "^0.29.19"
wheel = "^0.34.2"

[build-system]
requires = ["poetry==1.0.5"]
build-backend = "poetry.masonry.api"

app / main.py :

import os
import seccomp

print(os.environ['SOME_VAR_1'])
print(os.environ['SOME_VAR_2'])

Eu só queria compartilhar um "obrigado" por toda a ajuda nisso. @drakenclimber e eu ainda estamos ocupados tentando terminar a versão v2.5.0, então isso pode não receber muita atenção de nossa parte até que seja feito, mas posso prometer que não vamos nos esquecer disso :)

Esta página foi útil?
0 / 5 - 0 avaliações