Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/06/2014, à 15: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, à 17:57)

Hors ligne

#2 Le 11/06/2014, à 16:12

claudius01

Re : [Résolu] ouvrir avec un programme python

Bonjour,

Utiliser pour cela le Shebang


Cordialement, A+
--
Claudius

Hors ligne

#3 Le 11/06/2014, à 16: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, à 16: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 big_smile )


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, à 17: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, à 17: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, à 17: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, à 17:52

moissan

Re : [Résolu] ouvrir avec un programme python

merci ça marche : 2 doc et un exemple en 1/2h smile

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, à 18:00)

Hors ligne

#9 Le 11/06/2014, à 21: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, à 21:07)

Hors ligne

#10 Le 11/06/2014, à 22:12

pingouinux

Re : [Résolu] ouvrir avec un programme python

moissan #9 a écrit :

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, à 23: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, à 04: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, à 06:47)

Hors ligne

#13 Le 12/06/2014, à 05: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, à 06: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, à 06:27)

Hors ligne

#15 Le 12/06/2014, à 06: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