Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

recuperer le listing des modules installés via subprocess

0 votes

J'ai essayé ce code:

#! /usr/bin/env python3
# -*- encoding: utf-8 -*-

import os
import subprocess

c1 = subprocess.Popen("python3", stdout=subprocess.PIPE, shell=True)
c2 = subprocess.Popen("help()", stdout=subprocess.PIPE, shell=True)
c3 = subprocess.Popen("modules", stdout=subprocess.PIPE, shell=True)

with open("listing_mod.txt","w") as f:
    for mod in c3:
        f.write(str(mod))
        f.write("\n")

J' obtiens : TypeError: 'Popen' object is not iterable

demandé 22-Jun par buffalo974 (2,446 points)

3 Réponses

+1 vote
 
Meilleure réponse

Si tu fais un

print resultat

tu verras qu'il y a un peu plus de travail.

Mais vu que tu utilises pip. la réponse c'est de faire:

pip3 freeze > listing_mod.txt

sur l'installation de référence, et

pip3 install -r listing_mod.txt

pour mettre à jour une nouvelle installation.

répondu 28-Jun par Laurent
sélectionné 30-Jun par buffalo974

Oui je me suis rendu compte que pip freeze faisait exactement ce que je voulais, pas eu le temps de poster, connaissais pas l' option -r très pratique.

+1 vote

Un objet Popen n'est pas itérable.
j'imagine que tu veux boucler sur la sortie de la commande associée à 'c3'. Un petit tour vers la doc me fait penser que la ligne:

for mod in c3: ...

sera plus utile ainsi:

for mod in c3.stdout: ...
répondu 23-Jun par bubulle (2,056 points)
+1 vote

Tu dois exécuter la commande help('modules') dans python3. Pour cela tu dois lancer un process python3 et communiquer avec lui.

c1 = subprocess.Popen("python", stdin=subprocess.PIPE, stdout=subprocess.PIPE)
resultat = c1.communicate(input='help(\'modules\')')

Tu n'as plus qu'à parser le résultat.

répondu 26-Jun par Laurent

Le but final est d' avoir à ma disposition une liste de modules que je juge optimale pour ma façon de bidouiller.
Je sais que c'est mal mais je trimballe tout ce bloc en installant avec
sudo pip3 instal. Pas de virtualenv. A mon niveau, ça me va.

Mais quand je change d' os (distro instable avec bug critique par exemple)
j' aimerai automatiser la reinstallation de cette liste, en comparant la liste actuelle d'une liste de module repompé d'un bash_history.
J'arrive à ce stade:

import os
import subprocess

c1 = subprocess.Popen("py", stdin=subprocess.PIPE, stdout=subprocess.PIPE)
resultat = c1.communicate(input= b'help(\'modules\')')

with open("listing_mod.txt","w") as f:
    for mod in resultat:
        f.write(str(mod))

Mais j'obtiens des \r\n un peu partout, toutes mes manoeuvre
de faire une string.replace("\r\n,"") termine ainsi:
io.UnsupportedOperation: not readable

...