2
votes

Dans un environnement python, comment importer un package à partir d'une version spécifique?

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:

  • programme
  • programme

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.*


3 commentaires

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.


4 Réponses :


1
votes

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


1 commentaires

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?



0
votes

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


0 commentaires

0
votes

python pkg_resources peut vous aider.

https://setuptools.readthedocs.io/en/latest/pkg_resources.html#workingset-objects


0 commentaires

1
votes

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.


0 commentaires