web-dev-qa-db-fra.com

Comment développer localement un paquet python?

J'essaie d'apporter des modifications à un module python existant, puis de le tester localement. Quelle est la meilleure façon de faire cela?

J'ai cloné le module github et apporté des modifications, mais je ne suis pas sûr de savoir comment importer le paquet local au lieu de celui déjà installé.

8
Alex Xu

Le moyen le plus simple de procéder à de tels tests consiste à créer un environnement virtuel, puis à installer le paquet en mode development .

En supposant que vous soyez sur Linux, cela ressemblerait à quelque chose comme ça.

$ virtualenv dev_env
$ source dev_env/bin/activate
$ cd ~/project_folder
$ pip install -e .

Ce flux de travail n'écrasera pas le package déjà installé sur votre système. D’autres alternatives, peut-être même plus simples, consisteraient simplement à utiliser un IDE comme PyCharm qui s’occupe de la plupart de ces tâches pour vous.

4
eandersson

Une solution consiste à utiliser sys.path () .
Par exemple:

import sys
sys.path.insert(0, path/to/module)

De cette manière, vous accordez la priorité à un chemin spécifique lorsque vous recherchez un module.
Cela signifie que le module que vous souhaitez importer sera d'abord recherché dans path/to/module et ensuite dans les autres répertoires déjà présents dans sys.path.

L'avantage de cette approche est que cette nouvelle commande ne sera conservée qu'à l'intérieur de votre script sans modifier la commande d'importation des autres. 

Note: Pour les besoins du développement, vous devez utiliser virtualenv comme suggéré par @eandersson .

2
abc

Vous devriez probablement faire l'essentiel de votre travail de développement dans un environnement virtuel . Votre flux de travail pour cela pourrait ressembler à:

# activate the virtual environment in ~/vpy
. $HOME/vpy/bin/activate

# install my app and its dependencies
cd $HOME/src/myapp
pip install -e .

# use my forked library instead
cd $HOME/src/forkedlib
pip install -e .
pytest # or whatever tests the forked lib has

# try it out with my application too
cd $HOME/src/myapp
pytest # or whatever tests your app has
myapp

pip install -e fait un peu de magie pour que, lorsque vous import le module de la bibliothèque, il soit routé directement vers l’arborescence des sources extraites, donc si vous apportez des modifications dans forkedlib, puis que vous réexécutez myapp, vous verrez ces modifications directement.

Lorsque vous avez terminé, vous pouvez pip uninstall forkedlib, puis réexécuter pip install -e . pour réinstaller les dépendances (déclarées) de votre application. (Ou supprimez et recréez l'environnement virtuel, si cela est plus facile.)

1
David Maze

L'approche de answer by abc l'ajout du chemin du module au chemin du système convient aux tests instantanés locaux, mais ce n'est pas la solution complète, par exemple lorsque le code C doit être compilé ou que des crochets de ligne de commande doivent être définis. . Pour un test complet, vous voudrez peut-être installer le paquet à la place.

Un Python typique a un setup.py et peut être empaqueté dans un fichier de distribution (molette, ...) qui peut ensuite être installé localement à partir d'un fichier local.

Le flux de travail serait:

  • créer un paquet distribuable (peut inclure une commande comme python setup.py bdist_wheel)
  • créer un nouvel environnement virtuel pour le test (ou désinstaller toute version du package précédemment installée et non modifiée)
  • installe le paquet depuis le distribuable créé localement (peut être aussi simple que pip install --no-index --find-links=..)
  • lancer les tests

Il en résulte exactement la même situation pour tous les futurs utilisateurs du package. Il s’agit d’un test complet (y compris le processus d’installation), mais c’est aussi beaucoup d’efforts, c’est pourquoi je n’utilise habituellement que la méthode du chemin système pendant le développement, mais la méthode d'installation complète uniquement directement avant une version.

0
Trilarion