Bonjour,
je souhaiterais lancer un script Python puis récupérer toutes les infos qui appraîtraient dans la console Python y compris en cas d'erreur.
Quelqu'un a-t-il une solution ? un cours Python ?
Toute info est la bienvenue.
Bonjour,
je souhaiterais lancer un script Python puis récupérer toutes les infos qui appraîtraient dans la console Python y compris en cas d'erreur.
Quelqu'un a-t-il une solution ? un cours Python ?
Toute info est la bienvenue.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 import subprocess x = subprocess.Popen(["ls", "-l"],stdout=subprocess.PIPE, stderr=subprocess.PIPE) print "code retour:",x.wait() print "sortie standard" print x.stdout.read() print "erreurs" print x.stderr.read()
Salut,
il me manque des infos. Comment lancer un fichier Python ? Où met-on le chemin du dit fichier ?
Peut-être faut-il que je précise que je veux lancer un fichier A à tester à partir d'un fichier B. Ce sont les commandes à mettre dans le fichier B qui vérifie le fichier A qui m'intéressent.
Je ne sais pas si ca ca répond, mais voici comment tu peux recuperer les sorties d'erreur et les sorties standard de ton programme python.
Bien sur, il faut remplacer python.exe et mon_programme.py par les chemins complets ou relatif de l'executable python et de ton programme
Pour bien apprendre Python suis ces tutoriels et cours de formation Python : http://python.developpez.com/cours/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 import subprocess x = subprocess.Popen(["python.exe", "mon_programme.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) print "code retour:",x.wait() print "sortie standard" print x.stdout.read() print "erreurs" print x.stderr.read()
Sans oublier le meilleur cours gratuit Python : Apprendre à programmer avec Python 3 par Gérard Swinnen http://python.developpez.com/cours/apprendre-python3/
Merci beaucoup pour les précisions. Cela marche très bien.![]()
Bonjour,
je relance ce post car j'ai voulu aujourd'hui utiliser la commande ci-dessus dans le cas de scripts contenus dans des dossiers différents et là cela ne marche pas.
Concrètement voici ce que j'ai :
progLance.py marche bien tout seul mais lorsque je l'apppele via progLancantCommande.py, là cela ne marche plus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 progLancantCommande.py dossierA |____ progLance.py
Il faut savoir que dans progLance.py je travaille avec des lectures/écritures de fichiers. De plus, je ne peux pas faire d'importation de progLance.py pour des raisons propres au développement de mon projet.
Autre question : dans la cas de versions différentes de Python, comment peut-on forcer l'utilisation d'une version ? Faut-il mettre le chemin complet de l'EXE ?
1) "progLancantCommande.py" est le script contenant les opérations avec subprocess ? Si oui, alors dans
As-tu mis là où il y a "mon_programme.py", un chemin pour y parvenir, genre "./A/progLance.py" ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part x = subprocess.Popen(["python.exe", "mon_programme.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
2) oui
J'ai mal posé ma question : j'ai bien les fichiers qui sont lancés mais par contre certains des fichiers normalement créés ne le sont pas au bon endroit. J'utilise des choses comme :
Je pense finalement qu'il faudrait que je donne le chemin complet du fichier à créer. Je teste et dis si cela fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 file = open('__init__.py', 'w') file.write(text__init__py) file.close()
Ahhh... en fait c'est assez simple, admettons l'arborescence suivante:
sachant que file1.py lance file2.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Dossier1 +-Dossier2 | +-file2.py | +-file1.py
lorsque file1 lance file2, le répertoire courant de file2 ne sera pas /Dossier1/Dossier2, mais /Dossier1, c'est à dire le répertoire courant de file1.
Une fonction du module os permet de changer le répertoire courant, donc dans file1, avant d'utiliser subprocess, changes le répertoire courant, et puis remet-le à son état d'origine une fois file2 executé.
C'est bien ce que je pensais. C'est logique...quand on a compris.
![]()
Il faut faire l'appel comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 os.chdir(os.path.dirname(pathOfThePythonFile)) x = subprocess.Popen(["python.exe", pathOfThePythonFile], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Voici le code auquel je suis arrivé grâce à ce post. Merci les gars !
Grâce à ce code je peux chercher dans mon projet tous les fichiers ayant pour nom "tool_Builder_----.py" où les tirets ne sont pas des espaces.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 #!/usr/bin/env python #coding=utf-8 import os import glob import subprocess def listBuilder(path, currentFile): # Take a look here for example : # http://python.developpez.com/faq/?page=Fichier#ContenuRepertoire listDir =[] inTheDir = glob.glob(path + '\\*') for oneThing in inTheDir: if os.path.isdir(oneThing): listDir.extend(listBuilder(oneThing, currentFile)) else: fileNameSplitted = os.path.basename(oneThing).split('.') if fileNameSplitted[0].startswith('tool_Builder_') and fileNameSplitted[1]=='py' and fileNameSplitted[0].find(' ')==-1 : if oneThing <> currentFile: if os.path.dirname(oneThing) not in listDir: listDir.append(os.path.dirname(oneThing)) print '\n'*2 + '='*50 +'\n' + '='*50 print 'START - Execution of the following tool builder :' print '\t' + os.path.basename(oneThing) print '\t\t DIRECTORY : ' + str(os.path.dirname(oneThing)) print '\n' + '='*50 +'\n' + '='*50 # Take a look here for example : # http://www.developpez.net/forums/d659853/autres-langages/python-zope/general-python/executer-script-recuperer-sortie-console-python/ # # We have to change the directory from Python's point of view. os.chdir(os.path.dirname(oneThing)) x = subprocess.Popen(["python.exe", oneThing], stdout=subprocess.PIPE, stderr=subprocess.PIPE) print "code retour:",x.wait() print "sortie standard" print x.stdout.read() errors = x.stderr.read() if errors <> '': print "errors" print errors return listDir listDirFound = listBuilder(os.getcwd(), os.path.abspath( __file__ )) # os.path.abspath( __file__ ) gives the path of the current file. # Take a look here for example : # http://stackoverflow.com/questions/50499/in-python-how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executing # We can open the directory for the user so as to make some changes. # Take a look here for example : # http://www.developpez.net/forums/d695448/autres-langages/python-zope/general-python/ouvrir-faire-apparaitre-dossier/ answer = raw_input("""Type O or o to open all the directories containing tool_Builder_----.py files. """) if answer in ['O', 'o']: for i in range(len(listDirFound)): os.system('explorer "' + listDirFound[i] +'"' )
J'utilise ce type de fichiers pour construire des scripts Python contenant des données complexes, utiles à mon projet, lesquelles sont construites à partir de données que je renseigne à la main de façon aisée.
Si tu travailles sous *nix, tu seras peut-être intéressé par ce petit bout de code
Tu peux remplacer les 4 ? par une *.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 >>> from subprocess import Popen, PIPE >>> p = Popen('find -type f -name "tool_Builder_????.py"', shell=True, stdout=PIPE) >>> p.wait() 0 >>> dat = p.stdout.read() >>> dat[:-1].split('\n') ['./finder/tool_Builder_0233.py', './finder/fdg/tool_Builder_0233.py']
Un ? signifie "un caractère au hasard", et une * signifie "une chaine de caractère au hasard".
Merci comme cela je pourrais faire quelque qui sera multi-os.
Il faudrait juste que je retrouve comment tester si on est sous Windows ou Linux. J'ai cela quelque part mais je ne sais plus où.
Merci guigui, et pour ceux que cela intéressent aussi voir ici la doc. officielle.
Partager