web-dev-qa-db-fra.com

Exécutez pip dans python inactif

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.

8
Hyun-geun Kim

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.

4
Terry Jan Reedy

En fait, je pense que vous pouvez utiliser subprocess.Popen(apt-get numpy), je ne sais pas comment le faire avec PIP.

3
L_Pav

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.

3
fn.

Si vous êtes sur un Mac, vous devriez pouvoir le faire comme ceci:

  1. Accédez à votre IDLE.
  2. Exécutez l'aide ("modules").
  3. Trouvez le module HTML.
  4. Exécuter l'aide ('HTML')
  5. Il devrait apparaître une carte de fichiers, par exemple ce/fichier/carte/exemple /.
  6. Allez dans le Finder et faites la commande + shift + g et collez la carte de fichiers là-bas. Veuillez supprimer le dernier fichier, car alors vous allez aller dans les fichiers des modules.
  7. Il y a tous les modules. Si vous souhaitez ajouter des modules, téléchargez les fichiers du module et placez-les là.

J'espère que ceci vous aide.

0
Grifin