web-dev-qa-db-fra.com

Construire une roue pour un paquet (comme scipy) sans déclaration de dépendance

Je pense que cela ne fait aucune différence ici, mais j'utilise Python 2.7.

La partie générale de ma question est donc la suivante: j'utilise un virtualenv distinct pour chacun de mes projets. Je n'ai pas d'accès administrateur et je ne veux pas jouer avec les packages installés par le système de toute façon. Naturellement, je veux utiliser des roues pour accélérer les mises à niveau et les installations de packages à travers les virtualenvs. Comment puis-je construire une roue dont les dépendances ne sont satisfaites que dans un virtualenv spécifique?

Plus précisément, l'émission

pip wheel -w $WHEELHOUSE scipy

échoue avec

Building wheels for collected packages: scipy
  Running setup.py bdist_wheel for scipy
  Destination directory: /home/moritz/.pip/wheelhouse
  Complete output from command /home/moritz/.virtualenvs/base/bin/python -c "import setuptools;__file__='/home/moritz/.virtualenvs/base/build/scipy/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" bdist_wheel -d /home/moritz/.pip/wheelhouse:
  Traceback (most recent call last):

  File "<string>", line 1, in <module>

  File "/home/moritz/.virtualenvs/base/build/scipy/setup.py", line 237, in <module>

    setup_package()

  File "/home/moritz/.virtualenvs/base/build/scipy/setup.py", line 225, in setup_package

    from numpy.distutils.core import setup

ImportError: No module named numpy.distutils.core

----------------------------------------
  Failed building wheel for scipy
Failed to build scipy
Cleaning up...

parce que numpy n'est pas globalement présent et pendant que la construction de la roue fonctionne quand un virtualenv avec numpy installé est actif, il semble être une très mauvaise idée de faire dépendre la roue d'un virtualenv version de numpy.

pandas qui dépend également de numpy semble installer ses propres composants de numpy mais je ne suis pas sûr que ce soit la meilleure solution.

Je pourrais installer numpy avec --user et l'utiliser pour construire la roue scipy. Y a-t-il de meilleures options?

15
Midnighter

Description du problème

  • Avoir un python package (comme scipy), qui dépend d'autres packages (comme numpy) mais setup.py Ne déclare pas cette exigence /dépendance.
  • La construction d'une roue pour un tel package réussira dans le cas où l'environnement actuel fournit le ou les packages nécessaires.
  • Dans le cas où les packages requis ne sont pas disponibles, la construction d'une roue échouera.

Remarque: La solution idéale consiste à corriger le setup.py Cassé en y ajoutant la déclaration de package requise. Mais ce n'est généralement pas possible et nous devons faire un autre chemin.

Solution: installez d'abord les packages requis

La procédure (pour installer scipy qui nécessite numpy) comporte deux étapes

  1. construire les roues
  2. utilisez les roues pour installer le package dont vous avez besoin

Remplissez la timonerie avec les roues dont vous avez besoin

Cela ne doit être fait qu'une seule fois et peut être réutilisé plusieurs fois.

  1. avoir une configuration de pip correctement configurée pour que l'installation à partir des roues soit autorisée, le répertoire de la timonerie est configuré et chevauche avec download-cache et find-links comme dans l'exemple suivant de pip.conf:

    [global]
    download-cache = /home/javl/.pip/cache
    find-links = /home/javl/.pip/packages
    
    [install]
    use-wheel = yes
    
    [wheel]
    wheel-dir = /home/javl/.pip/packages
    
  2. installer toutes les bibliothèques système requises pour tous les packages, qui doivent être compilés

  3. construire une roue pour le package requis (numpy)

    $ pip wheel numpy
    
  4. configurez virtualenv (nécessaire une seule fois), activez-le et installez-le numpy:

    $ pip install numpy
    

    Lorsqu'une roue est prête, elle doit être rapide.

  5. construire une roue pour scipy (toujours dans le virtualenv)

    $ pip wheel scipy
    

    À présent, votre timonerie sera remplie des roues dont vous avez besoin.

  6. Vous pouvez supprimer le virtualenv temporaire, il n'est plus nécessaire.

Installation dans virtualenv frais

Je suppose que vous avez créé un nouveau virtualenv, que vous l'avez activé et que vous souhaitez y installer scipy.

L'installation de scipy à partir de la nouvelle roue scipy directement échouerait toujours si numpy manquait. Nous avons surmonté ce problème en installant numpy en premier.

$ pip install numpy

Et puis finir avec scipy

$ pip install scipy

Je suppose que cela pourrait être fait en un seul appel (mais je ne l'ai pas testé)

$ pip install numpy scipy

Installation répétée de scipy d'une version éprouvée

Il est probable qu'à un moment donné, une nouvelle version de scipy ou numpy sera publiée et pip tentera d'installer la dernière version pour laquelle il n'y a pas de roue dans votre timonerie.

Si vous pouvez vivre avec les versions que vous avez utilisées jusqu'à présent, vous devez créer requirements.txt En indiquant les versions de numpy et scipy que vous aimez et installez à partir de celui-ci.

Cela garantira la présence du paquet nécessaire avant qu'il ne soit réellement utilisé.

15
Jan Vlcinsky