Tengo problemas para compilar un paquete de python con python -m build . . setup.py falla en:
FileNotFoundError: [Errno 2] No such file or directory: 'requirements/requirements.txt' Es causado por el hecho de que la build está copiando primero los archivos a un directorio temporal. Pero solo está copiando source/ , README.md , setup.py , setup.cfg . No es copiar requirements/ .
Por razones complejas, mi setup.py necesita hacer referencia a otros archivos en la raíz del repositorio de origen, un directorio que contiene varios archivos requirements.txt. Realmente no vale la pena discutir por qué necesita estructurarse de esta manera, ya he pasado por ese largo debate con colegas.
Esto funciona bien cuando instalamos el paquete a través de pip install -e . o como una dependencia de git+ssh://... pero falla al compilar antes de enviar a un repositorio de pypi.
setup.cfg setup.py source/ source/my_package/ requirements/ requirements/requirements.txt requirements/some-other-requirements.txt setup.py hace referencia a este directorio antes de llamar a setup() .
from pathlib import Path from setuptools import setup, find_namespace_packages requirements_dir = Path("requirements") # This is the line that fails: with (requirements_dir / "requirements.txt").open() as f: install_requires = list(f) setup( packages=find_namespace_packages(where="source", include=["acme_corp.*"], exclude=["tests", "tests.*"]), package_dir={"": "source"}, install_requires=install_requires, extras_require=optional_packages, )build hace el trabajo correcto aquí. Después de construir el dist fuente, verifica si el resultado construido se puede instalar realmente. Y sin incluir los archivos bajo los requirements en el dist de origen, el dist de origen no se puede instalar y, por lo tanto, no se puede utilizar. Pruébalo:
$ python -m build --sdist # builds fine, but the tar is broken: $ cd dist $ tar tf pkg-0.0.1.tar.gz | grep requirements # will be empty $ pip wheel pkg-0.0.1.tar.gz # will fail Processing ./pkg-0.0.1.tar.gz File was already downloaded Preparing metadata (setup.py) ... error ERROR: Command errored out with exit status 1: command: ... Complete output (9 lines): Traceback (most recent call last): File "<string>", line 1, in <module> File "/tmp/pip-req-build-wfzz27_k/setup.py", line 9, in <module> with (requirements_dir / "requirements.txt").open() as f: File "/usr/lib64/python3.9/pathlib.py", line 1252, in open return io.open(self, mode, buffering, encoding, errors, newline, File "/usr/lib64/python3.9/pathlib.py", line 1120, in _opener return self._accessor.open(self, flags, mode) FileNotFoundError: [Errno 2] No such file or directory: '/tmp/pip-req-build-wfzz27_k/requirements/requirements.txt' Para solucionarlo, escriba un MANIFEST.in junto con setup.py que incluye el directorio de requirements en el dist de origen. Contenido del archivo de ejemplo:
graft requirementsLa creación de un distrito de origen debería funcionar ahora; también puede verificar que el sdist ahora contiene todos los archivos para instalar desde:
$ tar tf dist/pkg-0.0.1.tar.gz | grep requirements pkg-0.0.1/requirements/ pkg-0.0.1/requirements/requirements.txt ... Esto solo se refiere a la distribución de origen, ya que la rueda ya está integrada en el host (su máquina) y ya no contiene un script de configuración. La construcción de ruedas también ignorará el archivo MANIFEST.in .