Je suis curieux de courir pip. Chaque fois que j'ai exécuté pip dans la commande Shell dans des fenêtres comme ça
c:\python27\script>pip install numpy
Mais, je me demandais si je pouvais l'exécuter en python inactif.
import pip
pip.install("numpy")
Malheureusement, cela ne fonctionne pas.
Cette question porte, ou devrait être, sur la façon d'exécuter pip à partir d'un programme python. IDLE n'est pas directement pertinent pour cette version de la requête.
Pour développer le commentaire de J. J. Hakala: une ligne de commande telle que pip install pillow
Est divisée en espaces pour devenir sys.argv
. Lorsque pip est exécuté en tant que module principal, il appelle pip.main(sys.argv[1:])
. Si l'on importe pip, on peut appeler pip.main(arg_line.split())
, où arg_line
Est la partie de la ligne de commande après pip
.
En septembre dernier (2015), j'ai expérimenté l'utilisation de cette API involontaire à partir d'un autre programme python et j'ai signalé les premiers résultats sur le problème du tracker 23551 . Une discussion et d'autres résultats ont suivi.
Le problème avec l'exécution de plusieurs commandes en un seul processus est que certaines commandes pip mettent en cache non seulement sys.path, qui reste normalement constant, mais également la liste des packages installés, qui change normalement. Étant donné que pip est conçu pour exécuter une commande par processus, puis quitter, il ne met jamais à jour le cache. Lorsque pip.main est utilisé pour exécuter plusieurs commandes en un seul processus, les commandes données après la mise en cache peuvent utiliser un cache périmé et non plus correct. Par exemple, list
après install
montre comment les choses se passaient avant l'installation .
Un deuxième problème pour un programme qui veut examiner la sortie de pip est qu'il va à stdout et stderr. J'ai posté un programme qui capture ces flux dans des variables de programme dans le cadre de l'exécution de pip.
L'utilisation d'un appel de sous-processus pour chaque commande pip, comme suggéré par L_Pav, bien que moins efficace, résout les deux problèmes. La méthode communicate
rend les flux de sortie disponibles. Voir le doc du sous-processus.
En fait, je pense que vous pouvez utiliser subprocess.Popen(apt-get numpy)
, je ne sais pas comment le faire avec PIP.
Pour le moment, il n'existe aucun moyen officiel de le faire, vous pouvez utiliser pip.main mais votre session inactive actuelle ne "verra" pas ce paquet installé.
Il y a eu beaucoup de discussions sur comment ajouter une API programmatique "de haut niveau" pour pip , cela semble prometteur.
Si vous êtes sur un Mac, vous devriez pouvoir le faire comme ceci:
J'espère que ceci vous aide.