Ceci n'est pas un doublon de la question:
Importer des packages python avec différentes versions installées
Cela ne peut pas non plus être résolu par virtualenv / pipenv : packages qui partagent le même nom / chemin mais qui ont des code / version doit être installé dans le même environnement pour que le programme fonctionne correctement
Considérant le problème classique de dépendance de diamant suivant:
En supposant que nous ayons un accès complet au code source des packages 'program', 'feature_A' et 'feature_B', et que feature_A et feature_B ont le code suivant:
import library.*
4 Réponses :
J'installerais les différentes versions du package dans différents PYTHONPATH
, par exemple
import sys sys.path.insert(0, 'insertherepath2') import package #gets version 2 #maybe (depends on further dependencies) : sys.path.pop(0)
ou
import sys sys.path.insert(0, 'insertherepath1') import package #gets version 1 #maybe (depends on further dependencies) : sys.path.pop(0)
et de même pour l'autre version du package à installer dans un autre chemin insertherepath2
. Les deux installations dans différents PYTHONPATH
peuvent toujours accéder à d'autres packages couramment installés dans le chemin principal de python.
Pour utiliser les différents packages dans python
:
PYTHONPATH=insertherepath1 ; pip install --install-option="--prefix=insertherepath1" package==v1
et de manière équivalente pour utiliser l'autre version:
PYTHONPATH=insertherepath1 ; python setup.py install --prefix=insertherepath1
merci beaucoup pour l'idée! mais sys.path est un processus global, que se passe-t-il si 2 importations se produisent presque simultanément dans 2 threads?
Installation de versions spécifiques
pip vous permet de spécifier la version d'un package à installer à l'aide des spécificateurs de version. Par exemple, pour installer une version spécifique de requêtes:
demandes d'installation pip == 2.18.4
Pour installer la dernière version 2.x des requêtes:
demandes d'installation pip> = 2.0.0, <3.0.0
Pour installer les versions préliminaires des packages, utilisez l'indicateur --pre:
pip install - pré-demandes
python pkg_resources peut vous aider.
https://setuptools.readthedocs.io/en/latest/pkg_resources.html#workingset-objects
Je n'ai pas rencontré ce scénario moi-même. Ma suggestion serait de renommer les bibliothèques pour qu'elles s'installent sous des noms différents. Cela me semble être l'approche la plus simple.
Je vais continuer et demander,
En supposant que nous ayons un accès complet au code source des packages 'programme', 'feature_A' et 'feature_B'
... si tel est le cas, pourquoi ne pas restructurer votre code pour vous faciliter la vie? (par exemple,depuis library.v1 import func as funcv1; from library.v2 import func as funcv2
?)Ok, il semble que vous n'avez pas de contrôle sur la
bibliothèque
, n'est-ce pas? mon malentendu.vous pouvez également essayer de vous moquer des importations lors du chargement des fonctionnalités particulières.