Bonjour,
J'aimerais savoir si c'est possible d'ouvrir un fichier avec le module subprocess?
merci
Version imprimable
Bonjour,
J'aimerais savoir si c'est possible d'ouvrir un fichier avec le module subprocess?
merci
Salut,
Dans la mesure où la commande que tu mettras dans subprocess peut ouvrir un fichier, oui.
Mais si c'est pour traiter le contenu du fichier en Python, ça n'a pas beaucoup de sens.
Je suppose que tu connais l'instruction 'open("filename", "r")'
oui c'est plutot le premier cas puisque je cherche à ouvrir un fichier à distance.....on ma parlé de l'instruction: echo "blop" >> file sa signifie koi?
Est une commande shell. Echo “affiche” simplement ce que tu lui donnes (ici, “blop”).Code:echo "blop" >> file
>> est un opérateur qui va prendre ce qu’il a en entrée «*à gauche*», et l’ajouter à la sortie «*à droite*» –*en l’occurence, ton fichier :)
Donc, envoyer (par ssh par ex.) cette commande à la machine distante va bien (normalement*!) ajouter “blop” au contenu de file ;)
donc si j'ai bien compris, si je met le code suivant:
proc = subprocess.popen(["ssh","user+"@"+hostname,echo "blop" >> filename],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
ca devrait m'écrire blop dans filename?
ça à l'air de bien marcher sauf que je peut plus arrèter le processus une fois lancé:
et la on voit que c'est mois qui est obligé de stopper le processusCode:
1
2
3
4 toto[103]>test.py [6]+ Stopped test.py vrhel5[103>
ben oui, forcément, ssh est une appli interactive… Donc soit tu lui passes une commande pour le fermer (connais pas assez ssh pour savoir laquelle –*exit, peut-être…), soit tu fais un p’tit proc.terminate() une fois que ta commande a été exécutée…
comme je lance plusieurs fois la ligne proc = subprocess.Popen(.......) sa voudrait dire que je dois à chaque fois ajouter à la suite mon proc.terminate (c'est bien la bonne instruction) ou juste une seule fois à la fin du programme??
bon j'explique rapidement ce que je veut faire:
vérifier si une ligne est présente dans un fichier distant avec "grep":
ensuite je sais pas comment savoir si cette ligne est vraiment présente ou nonCode:proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep 'blop' filename"],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
puis ensuite je veux ajouter cette ligne si non présente dans le fichier avec echo:
si quelqu'un a une idée, sa fait des jours que je cherche sans résultatCode:proc = subprocess.Popen(["ssh", user+"@"+hostname,"echo 'blop' >> filename"],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Ah mais oui mais non*! Si tu veux exécuter plusieurs commandes sur le PC distant, ’faut surtout pas relancer à chaque fois une session ssh*!
Normalement, une fois que tu es connecté(e), tu devrais pouvoir envoyer des commandes avec proc.stdin, comme sur un vrai terminal… :mouarf:
Par exemple*:
Code:
1
2
3
4
5
6
7 proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep 'blop' filename"],stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) # Tu tassures que la connexion est bien établie, et que le résultat de grep est bon # Puis tu envoies ta deuxième commande*! proc.stdin.write("echo 'blop' >> filename\n") # etc. # Et enfin, tu termines ton sous-processus. proc.terminate()
Pour faire ce genre de chose, il y a des modules qui existent, comme paramiko. Ca evite d'avoir à gérer des choses un peu délicates dans le fait de lancer un ssh comme un process isolé.
Ben ça à l'air de fonctionner sauf pour la seconde instruction avec le stdin, voici mon code:
et sa m'affiche comme message d'erreur:Code:
1
2
3
4
5
6
7
8
9
10 BLOP = 'blop' proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep -x 'blop' filename"],stdout=subprocess.PIPE, stderr=subprocess.PIPE) CheckProcState = proc.poll() if CheckProcState == None: data = proc.communicate() result = data[0].strip() if result != BLOP: proc.stdin.write("echo 'blop' >> filename\n") proc.stdin.close()
AttributeError: 'NoneType' object has no attribute 'write' :calim2::calim2:
Regarde le code qu’on te donne quand même*! J’ai écrit…
, pas…Code:proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep 'blop' filename"],stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
!!!Code:proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep -x 'blop' filename"],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Et tu n’as pas besoin de faire un stdin.close(), stdin n’est qu’un lien (un pipe) avec ssh, pas un “vrai” fichier*!
alors toujours aucun résultat concernant le stdin, j'ai fait les rectifications necessaires mais je n'y comprend vraiment pas grand chose :
Code:
1
2
3
4 proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep 'blop' ucdprod"],stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) if proc.poll() == None: # si le process n'est pas encore terminé proc.stdin.write("echo 'blop' >> ucdprod")
qu'est ce qui ne va aps dans mon code?
Grmmmlll… Cette fois, tu oublies le '\n' à la fin de ta commande… Si tu ne tapes pas entrée, dans un terminal, ça ne marche pas non plus, s’pas*?
Et si ça ne marche toujours pas, tu peux essayer de rajouter un proc.stdin.flush() juste après le write(), mais je doute vraiment que ce soit nécessaire… ;)
ah oui je l'avais rajouté le "\n" dsl.....mais concernant le code que je viens d'établir à priori cela devrait marcher nn
que signifie dans le code suivant:
le stdin = proc.PIPE dans la seconde instruction? merci.....Code:
1
2
3 proc = subprocess.Popen(["ssh", user+"@"+hostname,"grep 'blop' ucdprod"],stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) proc1 = subprocess.Popen(["ssh", user+"@"+hostname,"echo 'blop' ucdprod"],stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=proc.PIPE)
Ben, simplement que tu utilises le même pipe (le même “fichier” virtuel) en entrée pour les deux procs (puisque tu utilises le stdin de proc comme stdin pour proc1)… Je ne suis pas absolument certain que ce soit fonctionnel, cela dit… ;)
Bou, j’étais fatigué, hier soir, j’avais mal lu… :aie:
Bonjour,
Et bien cela semble une tentative de faire un pipe (|) mais dans l'état actuel cela ne fonctionneras pas. La syntaxe correcte est
Ceci dit avez vous penser à pexpect ? Dans le cadre d'une 'interaction' cela me semble plus approprié.Code:
1
2
3
4 proc = subprocess.Popen([commande], stdout=subprocess.PIPE) proc1 = subprocess.Popen([othercommand], stdin=proc.stdout, stdout=subprocess.PIPE) proc.stdout.close() sortie = proc1.communicate()[0]
@+