#1 Le 11/06/2014, à 14:49
- moissan
[Résolu] ouvrir avec un programme python
bonjour
comment faire pour qu'un programme python soit utilisable pour ouvrir un fichier comme n'importe quel autre logiciel ?
en general on montre comment faire un programme qui ouvre un fichier dont le nom est ecrit dans le programme
il faudrait que je fasse un programme python qui ait le comportement d'un vrai logiciel : pouvant etre appelé par la console en tapant monprograme monfichier.txt ... ou en cliquant sur monfichier.txt et en choisissant ouvrir avec monprogramme
merci
Dernière modification par moissan (Le 11/06/2014, à 16:57)
Hors ligne
#2 Le 11/06/2014, à 15:12
- claudius01
Re : [Résolu] ouvrir avec un programme python
Hors ligne
#3 Le 11/06/2014, à 15:45
- moissan
Re : [Résolu] ouvrir avec un programme python
le diese au debut du fichier permet de demarrer le programme quand on tape son nom ou qu'on clique dessus , mais ne transmet pas le nom du fichier a ouvrir
si il y a un diese dans monprogramme , et que je tape monprogramme monfichier a la console le programme demarre mais ignore quel fichier je veux ouvrir
pour l'instant monprograme ouvre uniquement le fichier que j'ai ecrit dans le programe ... si je veux changer il faut modifier
je cherche le moyen que python peut utiliser pour avoir l'argument de la ligne de commande ou du systeme qui l'appele
Hors ligne
#4 Le 11/06/2014, à 15:58
- ssdg
Re : [Résolu] ouvrir avec un programme python
http://python.developpez.com/cours/Dive … uments.php
et voilà. (sinon, je ne connais que peu de choses à python mais google, je maitrise )
s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.
Hors ligne
#5 Le 11/06/2014, à 16:00
- claudius01
Re : [Résolu] ouvrir avec un programme python
Sauf erreur de ma part, c'est au programme python de parser la ligne de commande ?
cf. https://docs.python.org/2/library/argparse.html
Hors ligne
#6 Le 11/06/2014, à 16:22
- pingouinux
Re : [Résolu] ouvrir avec un programme python
Bonjour,
En plus de la doc qui t'es donnée ci-dessus, voici un exemple :
$ cat prog_pyt.py
#!/usr/bin/python
import sys
mon_fichier=sys.argv[1]
print("mon_fichier=%s"%mon_fichier)
$ ./prog_pyt.py monfichier.txt
mon_fichier=monfichier.txt
Hors ligne
#7 Le 11/06/2014, à 16:31
- claudius01
Re : [Résolu] ouvrir avec un programme python
Nous sommes tous trop bons (dans le sens bonté ;-)
Hors ligne
#8 Le 11/06/2014, à 16:52
- moissan
Re : [Résolu] ouvrir avec un programme python
merci ça marche : 2 doc et un exemple en 1/2h
j'avais deja commencé a oublier le coup de ./ devant le nom
ne pas oublier le chmod +x monprog.py
autre bizarerie : juste après le chmod le programme ne demarre pas en double cliquant dessus dans thunar : il faut d'abord le lancer une fois par la console , et ensuite il demarre par thunar
bien sur quand on lance l'exemple de pingouinux en double cliquant il ne se passe rien de visible , mais ce n'est pas grave puisque par la console ça montre que l'argument est bien transmis
Dernière modification par moissan (Le 11/06/2014, à 17:00)
Hors ligne
#9 Le 11/06/2014, à 20:04
- moissan
Re : [Résolu] ouvrir avec un programme python
suite des essais : =sys.argv[1] est un peu dangereux parce que ça plante python si il n'y a pas d'argument
pour mieux comprendre :
#!/usr/bin/python
# /home/denis/Documents/python/ouvrir/./xx.py
import sys
out = open('out.txt','w')
for arg in sys.argv :
print arg
out.write(arg)
out.write('\n')
out.close()
ça me fait un fichier contenant tous les argument disponible
si je le lance par la console , ça enregistre dans le fichier out.txt les autre mot tapé derrière xx.py
mais le but est de lancer ce programme en cliquant sur un fichier quelconque
ouvrir avec ...ouvrir avec une autre application...utilisé une commande personnalisé: et coller l'adresse /home/denis/Documents/python/ouvrir/./xx.py
avec ce /./ qui n'est jamais montré ...
et c'est bon : en ouvrant xx.py en cliquant sur un fichier quelconque on trouve en argument l'adresse de ce fichier : donc ce xx.py poura etre un programe de conversion de fichier : dans le genre qui crée un .txt de même nom que le .dxf ou on a cliqué
Dernière modification par moissan (Le 11/06/2014, à 20:07)
Hors ligne
#10 Le 11/06/2014, à 21:12
- pingouinux
Re : [Résolu] ouvrir avec un programme python
suite des essais : =sys.argv[1] est un peu dangereux parce que ça plante python si il n'y a pas d'argument
Il est normal que ça plante si le programme attend un nom de fichier et que tu n'en donnes pas. Tu peux néanmoins traiter proprement l'erreur.
$ cat prog_pyt.py
#!/usr/bin/python
import sys
try :
mon_fichier=sys.argv[1]
print("mon_fichier=%s"%mon_fichier)
except IndexError : print("Donner le nom du fichier")
$ ./prog_pyt.py
Donner le nom du fichier
$ ./prog_pyt.py monfichier.txt
mon_fichier=monfichier.txt
Hors ligne
#11 Le 11/06/2014, à 22:14
- moissan
Re : [Résolu] ouvrir avec un programme python
j'etait parti pour un truc dans le genre
if len(sys.argv) > 1 :
mais avec try except IndexError , c'est encore plus sur en évitant de faire une mauvaise comparaison
Hors ligne
#12 Le 12/06/2014, à 03:55
- moissan
Re : [Résolu] ouvrir avec un programme python
voila le resultat
un truc pour convertir les dxf en txt plus lisible , et inversement
#!/usr/bin/python
#-*- coding:Utf-8 -*-
# dxf2txt.py version 2 12/06/2014
# /home/denis/Documents/dxf2txt/dxf2txt.py et chmod +x ( exemple d'adresse )
#
# pour mettre dans le lanceur par clic droit :
# "ouvrir avec" "ouvrir avec une autre application" "utiliser une commande personnalisé:"
# et coller /home/denis/Documents/dxf2txt/./dxf2txt.py ( /./ pour le rendre executable )
#
# dxf>txt ou inversement suivant l'extension du fichier de depart
# fait un fichier.txt pour verification du fonctionnement
#
#fonctionne bien mais sera amelioré avec un affichage graphique
import sys
try : # evite le bloquage si il n'y a pas d'argument
source=sys.argv[1] #lit l'argument donné sur le fichier cliqué
out = open('fichier.txt','w') # ouvre ce fichier pour ecrire des info de controle
l = len(source)
out.write( "%i" %l ) # longueur de l'adresse
nom = source[:-3]
out.write( '\n' )
out.write( nom )
ext = source[(l-4):] # met l'extension dans ext
out.write( ' ' )
out.write( ext )
if ext == '.dxf' : # test pour lancer la conversion dxf>txt
dest = nom + 'txt'
out.write( '\n destination ' )
out.write( dest )
#remplace un retour a la ligne sur 2 par une virgule , pour faire un fichier plus facilement lisible
obFichier = open(dest,'w')
ofi = open(source, 'r')
a = 0
t = ofi.read(1)
while t != '' : # boucle jusqu'a fichier vide
if t == '\n' : # traite les retour a la ligne ('\n' en python )
if a == 0 :
a = 1
obFichier.write(',') # remplace 1 sur 2 par ','
else :
a = 0
obFichier.write('\n') # copie simplement 1 sur 2
else :
obFichier.write(t) # copie les caractere ordinaire
t = ofi.read(1)
ofi.close()
obFichier.close()
elif ext == '.txt' : # test pour lancer la conversion txt>dxf
dest = nom + 'dxf'
out.write( '\n destination ' )
out.write( dest )
obFichier = open(dest,'w')
ofi = open(source, 'r')
t = ofi.read(1)
while t != '' : # boucle jusqu'a fichier vide
if t == ',' :
obFichier.write('\n') # remplace , par retour a la ligne
else :
obFichier.write(t) # copie simplement les autres caracteres
t = ofi.read(1)
ofi.close()
obFichier.close()
else :
out.write(' extention inconnue ')
except IndexError :
out.write(" il manque le nom ")
out.write( '\n' )
out.write(' close ')
out.close()
Dernière modification par moissan (Le 12/06/2014, à 05:47)
Hors ligne
#13 Le 12/06/2014, à 04:47
- melixgaro
Re : [Résolu] ouvrir avec un programme python
salut,
qques remarques+suggestions :
1/ je crois que la ligne en-dessous de import sys est incorrecte, non ?
2/ tu pourrais utiliser
ext.lower() == ".txt"
et
ext.lower() == ".dxf"
dans tes tests, pour parer les cas pathologiques tXt TXT tXT TxT etc etc
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#14 Le 12/06/2014, à 05:20
- moissan
Re : [Résolu] ouvrir avec un programme python
le sys.argv[1] sous import sys ne sert a rien du tout ... ce n'est qu'un residu de collage qui n'a pas fait de defaut pendant les essai , mais qui va etre effacé pour de bon
c'est en dessous du try qu'il y a ce qu'il faut
import sys
sys.argv[1] #lit l'argument donné sur le fichier cliqué
try : # verifie qu'il y a bien un argument
source=sys.argv[1]
out = open('fichier.txt','w') # ouvre ce fichier pour ecrire des info de controle
l = len(source)
et la au moins la chaine donné par sys.argv[1] sert a quelque chose
en revoyant ça il est inutile de mettre la chaine dans la variable source ... il aurait été aussi simple d'ecrire sys.argv[1] a la place de source ... enfin le nom source facilite un peu la comprehension
minuscule ou majuscule ? pour mon usage immediat les extension sont en minuscule ... il ne serait pas complique d'accepter les 2 pour les extension ... mais ne pas melanger pour le reste du nom
il y a d'autre amelioration plus importante a faire : dans le genre verifier que la destination n'existe pas deja ! actuellement ça ecrase froidement un fichier qui existe deja !
le principal est de constater que le principe de rendre ce programme disponible dans le menu clic droit est bien pratique ... que les adresse sont bien transmise : même de 60caractere de long , ou même avec des blanc dans les noms de dossier
la version suivante fera des conversion plus compliqué et fera apparaitre une fenetre pour choisir ce que l'on veut faire
Dernière modification par moissan (Le 12/06/2014, à 05:27)
Hors ligne
#15 Le 12/06/2014, à 05:49
- moissan
Re : [Résolu] ouvrir avec un programme python
j'ai supprimé la ligne inutile , et il n'y a pas de surprise ça marche exactement pareil ... donc j'ai edité le message
Hors ligne