Libseccomp: RFE: hacer que los enlaces de Python estén disponibles a través de pip

Creado en 24 dic. 2016  ·  9Comentarios  ·  Fuente: seccomp/libseccomp

enhancement prioritlow

Todos 9 comentarios

Lo consideraré, pero considero que esto tiene una prioridad extremadamente baja en este momento (eso siempre puede cambiar).

Para referencia futura, documentación de Python sobre empaquetado / distribución de código:

Gracias @pcmoore por los comentarios sobre las relaciones públicas. Esperaba ayudar a empaquetar las fijaciones de pitón y comencé a investigarlo anoche.

Algunas de las soluciones rápidas fueron agregar MANIFEST.in y actualizar los archivos setup.py. Pude hacer que setup.py actualizado funcionara con pip install , pero seguro que necesita más trabajo para funcionar realmente con la versión de desarrollo (todavía no he investigado el fallo del # 217, pero tal vez pronto ).

En mi opinión, tendría sentido crear los enlaces de Python en un repositorio separado para un mejor flujo de trabajo de desarrollo / prueba / lanzamiento. He trabajado en proyectos de Python, pero no demasiado en Cythonized, pero estoy feliz de ayudar en todo lo que pueda.

Esperaba ayudar en la configuración de los documentos después de corregir el # 61 (que probablemente se simplificaría si lo movemos a un nuevo repositorio, aunque, idk cómo sphinx la herramienta de documentación de Python maneja los archivos cython).

Del comentario de @pcmoore en el número 216:

Básicamente, necesitamos decidir si queremos continuar admitiendo los enlaces de Python como parte de la distribución principal de la fuente libseccomp o si queremos dividirlos como lo hacemos con los enlaces de golang.

Me gusta la idea de dividir los enlaces de Python del paquete principal libseccomp, y también estoy de acuerdo en que es una prioridad bastante baja para mí. Sin embargo, si alguien más está interesado en retomar el trabajo, con mucho gusto ayudaría a revisarlo :).

Por cierto, estoy de acuerdo en que los enlaces de Python deben estar en un repositorio separado. Aunque no soy voluntario. : ^)

Si alguien con permisos para crear un nuevo repositorio en la organización seccomp puede configurarlo, puedo sacar los enlaces de Python del repositorio y crear un PR.

Hay un par de cambios que preveo:

  • Use las herramientas de compilación nativas de Python, setup.py build debería ser suficiente
  • Los números de versión se pueden codificar en setup.py o, en su lugar, se pueden recoger de las etiquetas git (usando el paquete setuptools-scm) si es necesario.
  • Enlace dinámico a libseccomp principal en lugar de enlace estático. (Ya propuesto en el n. ° 217)

No he investigado demasiado el arnés de prueba para ver si hay una buena manera de exportarlos para usar pruebas de Python nativas a través de los marcos de prueba de estilo pytest o nose2 .

Finalmente, algo de documentación adicional para construir paquetes de distribución tanto en código fuente como en distribuciones binarias.

Voy a marcar esto tentativamente para la v2.6, que en realidad significa "en algún momento después de que salga la v2.5". Terminar la v2.5 es nuestra prioridad en este momento, podemos revisar este problema más adelante.

Hacer que libseccomp pip-installable sea muy útil para mí también. Aquí está mi trabajo de aficionado sobre el uso de make / poetry / docker (y parcheando setup.py) si alguien más está tratando de resolverlo. También modifiqué / configuré los parámetros de compilación para que no requiriera sudo.

build-seccomp / setup.py (ligeramente 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 (tengo una versión equivalente pero más fea / más amigable con el caché en mi aplicación):

# ============= 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'])

Solo quería compartir un "gracias" por toda la ayuda en esto. @drakenclimber y yo todavía estamos ocupados tratando de terminar la versión v2.5.0, por lo que es posible que no recibamos mucha atención de nuestra parte hasta que esté hecho, pero puedo prometerles que no nos olvidaremos de esto :)

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

kloetzl picture kloetzl  ·  19Comentarios

grubeli picture grubeli  ·  3Comentarios

diekmann picture diekmann  ·  3Comentarios

drakenclimber picture drakenclimber  ·  10Comentarios

srd424 picture srd424  ·  18Comentarios