Ouvrir avec le bon programme.
Après avoir créé un fichier à l'aide d'un programme python (par exemple un fichier image ppm), on aimerait l'ouvrir pour contrôle avec un programme adéquat (lecteur d'image pour l'exemple) sans avoir de manipulation à faire.
On va pour cela utiliser le script de cette page de blog .
Copier coller le script dans un fichier que l'on nommera run.py.
import subprocess
import sys
import os
def run_file(path):
# Pas de EAFP cette fois puisqu'on est dans un process externe,
# on ne peut pas gérer l'exception aussi facilement, donc on fait
# des checks essentiels avant.
# Vérifier que le fichier existe
if not os.path.exists(path):
raise IOError('No such file: %s' % path)
# On a accès en lecture ?
if hasattr(os, 'access') and not os.access(path, os.R_OK):
raise IOError('Cannot access file: %s' % path)
# Lancer le bon programme pour le bon OS :
if hasattr(os, 'startfile'): # Windows
# Startfile est très limité sous Windows, on ne pourra pas savoir
# si il y a eu une erreu
proc = os.startfile(path)
elif sys.platform.startswith('linux'): # Linux:
proc = subprocess.Popen(['xdg-open', path],
# on capture stdin et out pour rendre le
# tout non bloquant
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
elif sys.platform == 'darwin': # Mac:
proc = subprocess.Popen(['open', '--', path],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
else:
raise NotImplementedError(
"Your `%s` isn't a supported operatin system`." % sys.platform)
# Proc sera toujours None sous Windows. Sous les autres OS, il permet de
# récupérer le status code du programme, and lire / ecrire sur stdin et out
return proc
Écrivons ensuite un code de production d'une image ppm dans un fichier couleurs.py :
largeur=100
hauteur=600
f=open('couleurs','w') # ou f=open('couleurs.ppm','w')
############ entête du fichier ##########################
f.write('P3'+'\n') # P1 était le code pour un pbm format ascii
# P3 correspond au ppm format ascii
f.write(str(largeur)+' '+str(hauteur)+'\n')
# valeur max pour l'intensité des couleurs :
f.write('255'+'\n')
############### fin de l'entête ########################
######### les pixels #################################
def rectangle(couleur) :
""" couleur est un triplet d'entiers, code RGB."""
for j in range(hauteur//6) :
for i in range(largeur) :
f.write(couleur+'\n')
rectangle('255 0 0')
rectangle('0 255 0')
rectangle('0 0 255')
rectangle('0 255 255')
rectangle('255 0 255')
rectangle('255 255 0')
########### fin pixels ############################
f.close()
L'objectif est de modifier ce code afin que l'image s'ouvre dans un logiciel adéquat en fin de programme.
On suppose pour cela que les fichiers couleurs.py, couleurs.ppm et run.py sont dans un même dossier.
Et l'on modifie ainsi le code :
from run import run_file
largeur=100
hauteur=600
f=open('couleurs.ppm','w')
############ entête du fichier ##########################
f.write('P3'+'\n') # P1 était le code pour un pbm format ascii
# P3 correspond au ppm format ascii
f.write(str(largeur)+' '+str(hauteur)+'\n')
# valeur max pour l'intensité des couleurs :
f.write('255'+'\n')
############### fin de l'entête ########################
######### les pixels #################################
def rectangle(couleur) :
""" couleur est un triplet d'entiers, code RGB."""
for j in range(hauteur//6) :
for i in range(largeur) :
f.write(couleur+'\n')
rectangle('255 0 0')
rectangle('0 255 0')
rectangle('0 0 255')
rectangle('0 255 255')
rectangle('255 0 255')
rectangle('255 255 0')
########### fin pixels ############################
f.close()
run_file('couleurs.ppm')