13 votes

Empêcher pip d'installer certaines dépendances

Nous sommes en train de développer un AWS Lambda pour la compétence Alexa en Python et en utilisant la fonction pip pour installer le ask-sdk à notre dist/ répertoire :

pip install -t dist/ ask-sdk

Le problème est avec le -t dist/ parce que pip veut que toutes les dépendances soient présentes, même si elles sont installées sur l'ensemble du système.

Maintenant, ask-sdk a une dépendance à l'égard de boto3 qui attire un tas d'autres paquets. Cependant, le AWS Lambda L'environnement d'exécution fournit boto3 et il n'est pas nécessaire d'empaqueter ce paquetage et ses dépendances avec notre code. J'ai boto3 installé dans le système et import boto3 fonctionne, alors j'ai pensé pip devrait être heureux, mais à cause de -t dist/ il l'installe toujours.

Est-ce que je peux installer seulement ask-sdk et ses dépendances qui n'existent pas dans le système, par ex. ask-sdk-core mais pas ceux qui sont déjà installés ?

Une façon de procéder est de lister tous les modules et d'utiliser pip --no-deps mais cela signifie qu'il faut constamment garder la trace des dépendances manuellement, ce que nous aimerions éviter.

D'une certaine manière, je voudrais dire pip : si le paquet est déjà installé, même si ce n'est pas dans -t dist/ ne pas mettre une copie dans dist/ .

Est-ce possible ?

Merci !

11voto

raychi Points 199

Bien que vous ne puissiez pas dire à pip d'"installer toutes les dépendances, sauf celles requises par boto3", vous pouvez générer les fichiers de configuration nécessaires. requirements.txt en calculant la différence entre boto3 y ask-sdk de pip freeze (testé avec Python 3.6.6) :

# get boto3 requirements
pip install boto3 -t py_lib.boto3
PYTHONPATH=py_lib.boto3 pip freeze > requirements-boto3.txt

# get ask-sdk requirements
pip install ask-sdk -t py_lib.ask-sdk
PYTHONPATH=py_lib.ask-sdk pip freeze > requirements-ask-sdk.txt

# compute their difference
grep -v -x -f requirements-boto3.txt requirements-ask-sdk.txt > requirements-final.txt

# patch to add one missing dep from boto3
# aws don't have this for some reason
grep urllib3 requirements-boto3.txt >> requirements-final.txt

El requirements-final.txt contient les éléments suivants :

ask-sdk==1.5.0
ask-sdk-core==1.5.0
ask-sdk-dynamodb-persistence-adapter==1.5.0
ask-sdk-model==1.6.2
ask-sdk-runtime==1.5.0
certifi==2018.11.29
chardet==3.0.4
idna==2.8
requests==2.21.0
urllib3==1.24.1

Pour installer le jeu final de dépendances dans un dossier :

pip install --no-deps -r requirements-final.txt -t py_lib

En sautant le boto3 vous pouvez économiser environ 45M de données à partir de vos dépendances python. Le site ask-sdk Les dépendances ne font qu'environ 7,5M (2,1M compressé), ce qui vous permet d'utiliser l'éditeur de code lambda intégré si vous en avez besoin.

4voto

Jim Todd Points 1087

Vous pouvez essayer l'option

  --no-dependencies

Pour ignorer toutes les dépendances.

Pour exclure un élément spécifique, vous pouvez le mettre dans un fichier d'exigences et le passer :

pip install --no-deps -r requirements.txt

2voto

Cela va fonctionner

$ pip install -t dist --no-deps ask-sdk

Après la commande ci-dessus, j'ai vérifié le contenu du répertoire dist avec l'arbre et il n'avait installé que ask-sdk sans ses dépendances.

dist/
 ask_sdk
    __init__.py
    __init__.pyc
    __version__.py
    __version__.pyc
    standard.py
    standard.pyc
 ask_sdk-0.1.3.dist-info
     INSTALLER
     METADATA
     RECORD
     WHEEL
     top_level.txt

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X