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:
setup.py build
deve ser suficientesetup.py
ou ser obtidos a partir de tags git (usando o pacote setuptools-scm) se necessário.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 :)