<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JBJ's Blog &#187; Python</title>
	<atom:link href="http://www.lyxia.org/blog/category/developpement/python/feed" rel="self" type="application/rss+xml" />
	<link>http://www.lyxia.org/blog</link>
	<description>Lyxia.org</description>
	<lastBuildDate>Sat, 27 Feb 2010 10:24:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Comment les spammeurs récupèrent-ils votre adresse mail?</title>
		<link>http://www.lyxia.org/blog/developpement/python/comment-les-spammeurs-recuperent-ils-votre-adresse-mail-180</link>
		<comments>http://www.lyxia.org/blog/developpement/python/comment-les-spammeurs-recuperent-ils-votre-adresse-mail-180#comments</comments>
		<pubDate>Sat, 02 Feb 2008 12:14:33 +0000</pubDate>
		<dc:creator>jbj</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/developpement/python/comment-les-spammeurs-recuperent-ils-votre-adresse-mail-180</guid>
		<description><![CDATA[Qui n'a jamais reçu quantité de messages indésirables sur son mail, sans avoir rien demandé? Assurément, peu d'entre nous. Vous le savez certainement, il ne faut jamais laisser son adresse mail "en dur" dans une page web. Pour comprendre pourquoi, je vous propose d'étudier ce petit code Python, qui scannera Google à la recherche d'adresses mail. Vous risquez d'etre surpris des résultats...]]></description>
			<content:encoded><![CDATA[<p>Qui n'a jamais reçu quantité de messages indésirables sur son mail, sans avoir rien demandé? Assurément, peu d'entre nous.  Vous le savez certainement, il ne faut jamais laisser son adresse mail "en dur" dans une page web. Pour comprendre pourquoi, je vous propose d'étudier ce petit code Python, qui scannera Google à la recherche d'adresses mail. Vous risquez d'etre surpris des résultats...</p>
<p>J'ai trouvé ce code assurément intéressant sur <a href="http://www.pythonfrance.com">pythonfrance.com</a>, et son auteur s'appelle kerneltony95. Compte tenu de la nature de ce programme, je tiens à rappeller que le but de cet article est d'apprendre comment les spammeurs récupèrent votre adresse e-mail, certainement pas de vous livrer à ce genre de gamineries vous même.<br />
Pour ceux à qui l'idée traverserait l'esprit, sachez que Christopher William Smith, surnommé à juste titre le roi du spam, à récemment été condamné à 30 ans de taule! ça calme, hein? <img src='http://www.lyxia.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Bon, assez discuté, voyons ce qui nous interesse, à savoir le code en lui-même:</p>
<pre>
#!/usr/bin/python

import sys
import re
import string
import httplib
import urllib2
import re

def StripTags(text):
    finished = 0
    while not finished:
        finished = 1
        start = text.find("&lt;")
        if start &gt;= 0:
            stop = text[start:].find("&gt;")
            if stop &gt;= 0:
                text = text[:start] + text[start+stop+1:]
                finished = 0
    return text

if len(sys.argv) != 2:
        print "\nrsx.py : Trouvez les e-mail sur google extention de goog-mail beta by tOny.\n"
        print "\nUsage : ./rsx.py <nom>\n"
        print "\nexemple: ./rsx.py hotmail.com \n"
        sys.exit(1)

domain_name=sys.argv[1]
d={}
page_counter = 0
try:
    while page_counter &lt;400:
        results = 'http://groups.google.com/groups?q='+str(domain_name)+'&amp;hl=en&amp;lr=&amp;ie=UTF-8&amp;start=' + repr(page_counter) + '&amp;sa=N'
        request = urllib2.Request(results)
        request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)')
        opener = urllib2.build_opener()
        text = opener.open(request).read()
        emails = (re.findall('([\w\.\-]+@'+domain_name+')',StripTags(text)))
        for email in emails:
            d[email]=1
            uniq_emails=d.keys()
        page_counter = page_counter +10
except IOError:
    print "erreur les e-mails de la companie sont introuvable sur Google Groupes !"+""
page_counter_web=0
try:
    print "\n\n+++++++++++++++++++++++++++++++++++++++++++++++++++++"+""
    print "+ rsx resultat de Google Groupes &amp; web:"+""
    print "+++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n"+""

    while page_counter_web &gt;400 :
        results_web = 'http://www.google.com/search?q=%40'+str(domain_name)+'&amp;hl=en&amp;lr=&amp;ie=UTF-8&amp;start=' + repr(page_counter_web) + '&amp;sa=N'
        request_web = urllib2.Request(results_web)
        request_web.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)')
        opener_web = urllib2.build_opener()
        text = opener_web.open(request_web).read()
        emails_web = (re.findall('([\w\.\-]+@'+domain_name+')',StripTags(text)))
        for email_web in emails_web:
            d[email_web]=1
            uniq_emails_web=d.keys()
        page_counter_web = page_counter_web +10

except IOError:
    print "erreur les e-mails de la companie sont introuvable sur google web !"+""
for uniq_emails_web in d.keys():
    print uniq_emails_web+""
</nom></pre>
<p>Ce programme fonctionne en ligne de commande. Utilisez la syntaxe suivante:</p>
<pre>python rsx.py hotmail.fr</pre>
<p>Assez impressionnant de voir que l'on peut trouver des centaines d'adresses e-mail avec simplement 67 lignes de code. On ne le répetera jamais assez, ne mettez jamais votre mail sur le web!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/python/comment-les-spammeurs-recuperent-ils-votre-adresse-mail-180/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>pygtk: Notebook avec un bouton fermer</title>
		<link>http://www.lyxia.org/blog/developpement/python/pygtk-notebook-avec-un-bouton-fermer-67</link>
		<comments>http://www.lyxia.org/blog/developpement/python/pygtk-notebook-avec-un-bouton-fermer-67#comments</comments>
		<pubDate>Tue, 02 Oct 2007 23:46:05 +0000</pubDate>
		<dc:creator>jbj</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[pygtk]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/developpement/pygtk-notebook-avec-un-bouton-fermer-67</guid>
		<description><![CDATA[Sur de nombreux forums dédiés à Python, j'ai souvent eu l'occasion de voir des demandes d'utilisateurs
concernant des onglets de <em>Notebook</em> fermables via un bouton, à la manière des onglets de firefox 2.
J'ai trouvé ce code sur le web, il à été écrit par syeric en utilisant pygtk.
Bon coding :) ]]></description>
			<content:encoded><![CDATA[<p>Sur de nombreux forums dédiés à Python, j'ai souvent eu l'occasion de voir des demandes d'utilisateurs<br />
concernant des onglets de <em>Notebook</em> fermables via un bouton, à la manière des onglets de firefox 2.<br />
J'ai trouvé ce code sur le web, il à été écrit par <a href="http://syericblog.fr/dotclear/index.php?2007/05/16/4-notebook-avec-bouton-fermer-pygtk">syeric</a> en utilisant pygtk.<br />
Bon coding <img src='http://www.lyxia.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre>
#!/usr/bin/env python
# -*- coding:utf-8 -*-

#  notebook.py

import pygtk
pygtk.require('2.0')
import gtk

class NotebookExample:
    def add_icon_to_button(self,button):
	"Fonction pour ajouter un bouton fermer"
	#création d'une boite horizontale
        iconBox = gtk.HBox(False, 0)
	#Création d'une image vide
        image = gtk.Image()
	#On récupère l'icone du bouton "fermer"
        image.set_from_stock(gtk.STOCK_CLOSE,gtk.ICON_SIZE_MENU)
	#On enlève le relief au bouton (donné en attribut)
        gtk.Button.set_relief(button,gtk.RELIEF_NONE)
	#On récupère les propriétés du bouton
        settings = gtk.Widget.get_settings(button)
	#On affecte à w et h les dimensions
        (w,h) = gtk.icon_size_lookup_for_settings(settings,gtk.ICON_SIZE_MENU)
	#On modifie ces dimensions
        gtk.Widget.set_size_request(button, w + 4, h + 4)
        image.show()
	#On met l'image dans la boite
        iconBox.pack_start(image, True, False, 0)
	#On ajoute la boite dans le bouton
        button.add(iconBox)
        iconBox.show()
        return 

    def create_custom_tab(self,text, notebook, frame):
        "Crée une tab customisée avec un label et un bouton fermer"
	#On crée une eventbox
        eventBox = gtk.EventBox()
	#On crée une boite horizontale
        tabBox = gtk.HBox(False, 2)
	#On crée un label "text" (text donné en attribut)
        tabLabel = gtk.Label(text)
	#On crée un bouton
        tabButton=gtk.Button()
	#On lui affecte la méthode remove_book
        tabButton.connect('clicked',self.remove_book, notebook, frame)

        #On ajoute l'image au bouton en utilisant la méthode add_icon_to_button
        self.add_icon_to_button(tabButton)

        eventBox.show()
        tabButton.show()
        tabLabel.show()
	#On attache label et bouton à la boite
        tabBox.pack_start(tabLabel, False)
        tabBox.pack_start(tabButton, False)

        tabBox.show_all()
	#On ajoute la boite à l'eventbox
        eventBox.add(tabBox)
        return eventBox

    def remove_book(self, button, notebook, frame):
	"Fonction de suppression de page"
	#On supprime la page. Le secret, c'est de donner comme argument le widget enfant de la page, ici un cadre frame.
        notebook.remove(frame)
        # On actualise le widget
        notebook.queue_draw_area(0,0,-1,-1)

    def delete(self, widget, event=None):
        gtk.main_quit()
        return False

    def __init__(self):
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.connect("delete_event", self.delete)
        window.set_border_width(10)

        #On crée un nouveau notebook
        notebook = gtk.Notebook()
        window.add(notebook)
        notebook.show()

        # On ajoute quelques pages
        for i in range(5):
            page_number = i + 1
            frame = gtk.Frame("Frame %d" % page_number)
            frame.set_border_width(10)
            frame.set_size_request(100, 75)
            frame.show()
            label = gtk.Label("Dans la Frame %d" % page_number)
            frame.add(label)
            label.show()

            eventBox = self.create_custom_tab("Tab %d" % page_number, notebook, frame)
            notebook.append_page(frame, eventBox)
        # Page que nous verrons à l'ouverture (page 4)
        notebook.set_current_page(3)
        window.show()

def main():
    gtk.main()
    return 0

if __name__ == "__main__":

    NotebookExample()

    main()</pre>
<p>Et voilà le résultat du code ci-dessus. Beau boulot <img src='http://www.lyxia.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<img src="http://www.lyxia.org/blog/wp-content/uploads/2007/10/onglets.jpg" alt="onglets.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/python/pygtk-notebook-avec-un-bouton-fermer-67/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Créez un lecteur audio en python avec le module PyMedia</title>
		<link>http://www.lyxia.org/blog/developpement/python/creez-un-lecteur-audio-en-python-avec-le-module-pymedia-57</link>
		<comments>http://www.lyxia.org/blog/developpement/python/creez-un-lecteur-audio-en-python-avec-le-module-pymedia-57#comments</comments>
		<pubDate>Mon, 24 Sep 2007 07:30:23 +0000</pubDate>
		<dc:creator>jbj</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[pymedia]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/non-classe/creez-un-lecteur-audio-en-python-avec-le-module-pymedia-57</guid>
		<description><![CDATA[pyMedia est un module pour manipuler les fichiers wav, mp3, ogg, avi, divx, dvd et cdda.
Voyons ensemble comment réaliser un lecteur audio minimaliste en utilisant la classe <em>player</em> de pyMedia.]]></description>
			<content:encoded><![CDATA[<p>pyMedia est un module pour manipuler les fichiers wav, mp3, ogg, avi, divx, dvd et cdda.<br />
Voyons ensemble comment réaliser un lecteur audio minimaliste en utilisant la classe <em>player</em> de pyMedia.</p>
<h2>Avant de commencer</h2>
<p>Le site du module: <a href="http://pymedia.org/" hreflang="en">http://pymedia.org/</a><br />
La documentation: <a href="http://pymedia.org/docs/index.html" hreflang="en">Documentation</a></p>
<p><strong>Installation sous GNU/Linux:</strong><br />
Pour les utilisateurs Debian/Ubuntu, un paquet <em>.deb</em> est disponible ici: <a href="http://sourceforge.net/project/showfiles.php?group_id=86491&amp;package_id=89813&amp;release_id=368116" hreflang="fr">paquet pymedia pour Debian/Ubuntu</a><br />
Installez-le via votre gestionnaire de paquets.</p>
<p><strong>Installation sous Windows:</strong><br />
Les utilisateurs de windows trouveront un fichier .exe <a href="http://downloads.sourceforge.net/pymedia/pymedia-1.3.7.2.win32-py2.4.exe?modtime=1148473693&amp;big_mirror=0" hreflang="fr">ici</a><br />
Ouvrez-le et il s'installera automatiquement.</p>
<h2>Les exemples:</h2>
<p><strong>Un player audio minimal:</strong></p>
<pre>
import pymedia
import time

player = pymedia.Player() #Création de l'objet player
player.start()
player.startPlayback('unFichierSon.mp3') #Chemin du fichier son à  lire

while player.isPlaying(): #On boucle tant que la lecture n'est pas terminée
    time.sleep( 0.01 )</pre>
<p>Le module pymedia.player permet de lire facilement les types de fichiers musicaux supportÃ©s par pymedia.</p>
<p><strong>Un meilleur exemple avec un Thread:</strong></p>
<pre>
import threading
import time
import pymedia
from Tkinter import *

class playFile(threading.Thread):

	def __init__(self, file_name):
		global player
		threading.Thread.__init__ (self)
		player= pymedia.Player()
  		player.start()
		self.keepGoing = True
  		player.startPlayback(file_name)

	def run(self):
		global player
		while player.isPlaying() and self.keepGoing:
    			time.sleep( 0.01 )

	def stop(self):
		global player
		player.stopPlayback()
		self.keepGoing = False

def play():
    global pf
    pf = playFile("a.mp3") #le fichier son à  jouer
    pf.start()

def stop():
    global pf
    pf.stop()

#La GUI
root= Tk()
play = Button(text="play", command=play)
play.pack()
stop = Button(text="stop", command=stop)
stop.pack()
e = Entry()
e.pack()
root.mainloop()</pre>
<p>Cet exemple utilisant les Threads, <strong>il est necessaire de s'assurer que tous les threads ont été stoppés avant de quitter l'application</strong>, sinon gare aux mauvaises surprises. L'utilisation du thread permet -outre le fait de disposer d'une classe totalement réutilisable- l'execution simultanée de deux portions de code distinctes, à  savoir l'interface graphique Tk et les fonctions de controle du son.</p>
<p>La <a href="http://www.pymedia.org/docs/pymedia.player.html" hreflang="en">documentation du module pymedia.player</a> liste les différentes méthodes disponibles.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/python/creez-un-lecteur-audio-en-python-avec-le-module-pymedia-57/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Créez des executables pour vos scripts python</title>
		<link>http://www.lyxia.org/blog/developpement/python/creez-des-executables-46</link>
		<comments>http://www.lyxia.org/blog/developpement/python/creez-des-executables-46#comments</comments>
		<pubDate>Mon, 10 Sep 2007 05:29:57 +0000</pubDate>
		<dc:creator>jbj</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[package]]></category>
		<category><![CDATA[py2exe]]></category>
		<category><![CDATA[pyinstaller]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/tutoriaux/creez-des-executables-46</guid>
		<description><![CDATA[pyInstaller est un outil permettant d'empaqueter un script python dans un exécutable. A la différence du célèbre py2exe, il est multi-plateforme et permet d'empaqueter tous les fichiers necessaires au fonctionnement dans un seul fichier binaire.]]></description>
			<content:encoded><![CDATA[<p>pyInstaller est un outil permettant d'empaqueter un script python dans un exécutable. A la différence du célèbre py2exe, il est multi-plateforme et permet d'empaqueter tous les fichiers necessaires au fonctionnement dans un seul fichier binaire. Pratique pour distribuer un programme sans se soucier des modules disponibles sur le poste des utilisateurs...<br />
Notez qu'il ne s'agit pas de la transformation d'un script python en un vrai executable. L'empaquetage n'améliorera aucunement la vitesse d'execution du script. Il s'agit simplement de regrouper script, modules et une "mini-version" de l'interpreteur python dans un seul fichier, permettant ainsi à n'importe qui d'executer votre script, même si python n'est pas installé sur votre système.</p>
<p>Téléchargez l'archive sur <a href="http://www.pyinstaller.org/" hreflang="en">http://www.pyinstaller.org/</a> et décompressez là sur votre machine.<br />
Sous Linux, assurez vous d'avoir installé les paquets <strong>python-dev</strong> et <strong>zlib1g-dev.<br />
</strong>Executez <strong>Configure.py</strong> et déplacez-vous dans <em>source/linux</em>. Ensuite, executez <strong>Make.py</strong> puis la commande <strong>make</strong>.Si tout s'est bien déroulé, les bootloaders (<em>run</em> et <em>run_d</em>) auront été créés dans <strong>support/loader</strong>.</p>
<p>Sous windows, vous n'avez qu'à télécharger et décompresser l'archive.<br />
Pour la suite du tuto, je considèrerais pyinstaller installé dans le répertoire <strong>/home/pyinstaller</strong>.</p>
<p>Choisissez un script Python qui sera votre premier script compilé avec Pyinstaller. Pour plus de confort, déplacez le dans le dossier racine de pyinstaller. Pour cet exemple, notre script à  compiler s'appellera <strong>script.py</strong></p>
<p>Ouvrez une console. Déplacez vous jusqu'au répertoire de pyinstaller. dans le cadre de notre exemple, cela donne: <strong>/home/pyinstaller/pyinstaller-1.3 puis </strong>Executez le script de configuration en tapant <strong>Configure.py</strong> .Vous devriez voir apparaitre ce genre de messages à  l'écran:</p>
<pre>
C:pyinpyinstaller-1.3&gt;Configure.pyI: computing EXE_dependenciesW: Cannot determine your Windows or System directoriesW: Please add them to your PATH if .dlls are not found
W: or install starship.python.net/skippy/win32/Downloads.html
I: Finding TCL/TK...
I: found TCL/TK version 8.4
I: testing for Zlib...
I: ... Zlib available
I: Testing for ability to set icons, version resources...
I: ... resource update unavailable - No module named win32api
I: Testing for Unicode support...
I: ... Unicode available
I: testing for UPX...
I: ...UPX unavailable
I: computing PYZ dependencies...</pre>
<p>Nous allons maintenant créer le fichier <strong>spec</strong> grace au script <strong>Makespec.py</strong>.</p>
<p><strong>Makespec.py</strong> accepte de nombreuses options pour la création de votre fichier exe. Les voici:</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="22%">-h, --help</td>
<td width="78%">Affiche l'aide</td>
</tr>
<tr>
<td>-F, --onefile</td>
<td>Créer un seul fichier executable</td>
</tr>
<tr>
<td>-D, --onedir</td>
<td>Créer l'executable sous forme d'un répertoire de plusieurs fichiers (défaut)</td>
</tr>
<tr>
<td>-w, --windowed, --noconsole</td>
<td>Ne pas afficher la console lors de l'execution (Windows uniquement)</td>
</tr>
<tr>
<td>-c, --nowindowed, --console</td>
<td>Afficher la console à l'execution (Windows uniquement)</td>
</tr>
<tr>
<td>-a, --ascii</td>
<td>N'inclus PAS l'encodage unicode (Par défaut, inclus si disponible)</td>
</tr>
<tr>
<td>-d, --debug</td>
<td>Mode verbeux.</td>
</tr>
<tr>
<td>-s, --strip</td>
<td>Supprime le fichier exe et les libs partagées. Ne pas essayer sous Windows <img src='http://www.lyxia.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </td>
</tr>
<tr>
<td>-X, --upx</td>
<td>Utilise UPX si disponible.</td>
</tr>
<tr>
<td>-K, --tk</td>
<td>Inclus TCL/TK.</td>
</tr>
<tr>
<td>-o DIR, --out=DIR</td>
<td>Génère le fichier spec dans le répertoire spécifié.</td>
</tr>
<tr>
<td>-n NAME, --name=NAME</td>
<td>Nom du projet. Par défaut, le nom utilisé sera celui du script.</td>
</tr>
<tr>
<td>-p DIR, --paths=DIR</td>
<td>Définit le répertoire pour les imports (Il est possible de spécifier plusieurs répertoires en les séparant d'un point virgule ";".</td>
</tr>
<tr>
<td>-v FILE, --version=FILE</td>
<td>Ajoute un fichier de ressource version à l'éxecutable.</td>
</tr>
<tr>
<td>--icon=FILE.ICO or FILE.EXE,ID</td>
<td>Ajoute l'icone (.ico uniquement) spécifiée au projet. Vous devez avoir installé pywin32 pour utiliser cette option.</td>
</tr>
</table>
<p>Pour compiler script.py en un seul fichier executable:<br />
<code>Makespec.py -F "script.py"</code><br />
La console renverra le message suivant, vous indiquant ou se trouve votre fichier spec:<br />
<code>wrote pyinpyinstaller-1.3scriptscript.specnow run Build.py to build the executable</code><br />
Il ne reste plus qu'a executer la commande Build.py pour construire l'executable:<br />
<code>Build.py "script/script.spec"</code><br />
Si tout s'est bien passé, vous trouverez un répertoire pourtant le nom de votre script (donc, dans le cadre de ce exemple, le répertoire s'appelle <strong>script</strong>), votre fichier executable est dedans.</p>
<p>Vous pouvez désormais distribuer l'executable, il sera fonctionnel même si l'utilisateur final n'a pas installé Python ou un de ses modules externes.</p>
<p>Si vous avez eu des erreurs lors de compilation, ou si votre executable ne fonctionne pas, vous pouvez consulter le fichier warn.txt qui donne des informations sur les problemes qu'a pu rencontrer pyinstaller lors de la compilation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/python/creez-des-executables-46/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Créer facilement un paquet .deb pour un programme Python</title>
		<link>http://www.lyxia.org/blog/developpement/python/creer-facilement-un-paquet-deb-pour-un-programme-python-45</link>
		<comments>http://www.lyxia.org/blog/developpement/python/creer-facilement-un-paquet-deb-pour-un-programme-python-45#comments</comments>
		<pubDate>Wed, 05 Sep 2007 23:05:11 +0000</pubDate>
		<dc:creator>jbj</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[package]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/developpement/creer-facilement-un-paquet-deb-pour-un-programme-python-45</guid>
		<description><![CDATA[C'est en flanant sur Ubuntu-fr.org, que je suis tombé sur ce code pour le moins intéréssant. Créé à l'origine pour pypar2, ce script permet, après quelques modifications, de créer un paquet Debian (.deb) pour votre script Python.]]></description>
			<content:encoded><![CDATA[<p>C'est en flanant sur <a href="http://www.ubuntu-fr.org/">Ubuntu-fr.org</a>, que je suis tombé sur ce code pour le moins intéréssant. Créé à l'origine pour <a href="http://pypar2.silent-blade.org/">pypar2</a>, ce script permet, après quelques modifications, de créer un paquet Debian (.deb) pour votre script Python.<br />
En théorie, le script devrait donner les même résultats avec d'autres langages, toutefois je n'ai pas testé.</p>
<p>On y va <img src='http://www.lyxia.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Tout d'abord, il faut créer un fichier appellé control-install, avec ce contenu:</p>
<pre>
Package: test
Version: 0.1
Section: utils
Priority: optional
Architecture: i386
Depends: python (&gt;=2.4), python-xml (&gt;=0.8)
Maintainer: vous (vous@gmail.com)
Description: Juste un test de paquet Debian</pre>
<p>Modifiez les valeurs à votre convenance, en prenant grand soin de <strong>renseigner avec exactitude les dépendances</strong> liées à votre programme. Dans le cas contraire, et si l'utilisateur de votre programme n'a pas ces dépendances d'installées sur sa machine, votre programme ne fonctionnera pas.</p>
<p>Créez le script suivant sur votre machine et nommez le <em>create_package.sh</em>:</p>
<pre>
#!/bin/sh
INSTALL_DIR="/usr/share/test"
MAN_DIR="/usr/share/man/test"
BIN_DIR="/usr/bin"
APP_DIR="/usr/share/applications"
LOC_DIR="/usr/share/locale"
ICO_DIR="/usr/local/share/pixmaps"
VERSION=`cat control-install | grep "Version" | cut -d  -f2`

mkdir -p test/DEBIAN
cp control-install test/DEBIAN/control

mkdir -p "test"$ICO_DIR
cp pix/test.png "test"$ICO_DIR

mkdir -p "test"$MAN_DIR
cp doc/test "test"$MAN_DIR

mkdir -p "test"$INSTALL_DIR
mkdir -p "test"$INSTALL_DIR"/src"
cp src/*.py "test"$INSTALL_DIR"/src/"

mkdir -p "test"$INSTALL_DIR"/res"
cp res/*.glade "test"$INSTALL_DIR"/res/"

mkdir -p "test"$INSTALL_DIR"/pix"
cp pix/*.png "test"$INSTALL_DIR"/pix/"

mkdir -p "test"$INSTALL_DIR"/doc"
cp doc/gpl.txt "test"$INSTALL_DIR"/doc/"

cp doc/whatsnew.txt "test"$INSTALL_DIR"/doc/"
mkdir -p "test"$APP_DIR

cp res/*.desktop "test"$APP_DIR
mkdir -p "test"$BIN_DIR

cp start-install.sh "test"$BIN_DIR"/test"
mkdir -p "test"$LOC_DIR

cp -R locale/* "test"$LOC_DIR

dpkg-deb --build test test-$VERSION.deb
rm -rf test</pre>
<p>Placez le au même niveau que la source de votre programme et du fichier control-install puis rendez-le executable :<br />
<code><br />
sudo chmod +x create_package.sh</code></p>
<p>Ensuite, vous devez modifier "test" par le nom de votre programme. Pour remplacer toutes les occurences de <em>test</em> par <em>monprogramme</em>, ouvrez <em>create_package.sh</em> sous VI et procédez comme suit:<br />
:%s/test/monprogramme/g</p>
<p>Avant d'éxecuter le script, pensez à relire le script et à remplacer certaines valeurs qui ne correspondraient pas à l'arborescence de votre programme. Par exemple, le script considère par défaut que vos images sont dans un dossier <em>pix.</em></p>
<p>Une fois que tout est prêt, un bon<br />
<code>sudo ./create_package.sh</code><br />
et votre paquet Debian trône fièrement devant vous <img src='http://www.lyxia.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/python/creer-facilement-un-paquet-deb-pour-un-programme-python-45/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Quelques modules Python</title>
		<link>http://www.lyxia.org/blog/developpement/python/quelques-modules-python-6</link>
		<comments>http://www.lyxia.org/blog/developpement/python/quelques-modules-python-6#comments</comments>
		<pubDate>Mon, 30 Jul 2007 21:50:50 +0000</pubDate>
		<dc:creator>jbj</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[modules]]></category>

		<guid isPermaLink="false">http://www.lyxia.org/blog/?p=6</guid>
		<description><![CDATA[Voici une petite liste non-exhaustive de modules additionnels pour Python.
Dernière mise à jour de la liste: Mardi 31 Juillet 2007
Derniers modules ajoutés: pyGoogle, pyWordNet et pyExcept.]]></description>
			<content:encoded><![CDATA[<p>Voici une petite liste non-exhaustive de modules additionnels pour Python.<br />
Dernière mise à jour de la liste: Lundi 27 Aout 2007<br />
Dernier modules ajouté: Mechanize.</p>
<table border="0" cellpadding="0" cellspacing="0" width="751">
<tr>
<td width="181">Interface graphique</td>
<td width="110">wxPython</td>
<td width="366"><a href="http://wxpython.org">http://wxpython.org</a></td>
<td width="94">&nbsp;</td>
</tr>
<tr>
<td>Interface graphique</td>
<td>pyGtk</td>
<td><a href="http://www.pygtk.org">http://www.pygtk.org</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Interface graphique</td>
<td>pyQT</td>
<td><a href="http://www.riverbankcomputing.co.uk/pyqt/">http://www.riverbankcomputing.co.uk/pyqt/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Interface graphique</td>
<td>Pmw</td>
<td><a href="http://pmw.sourceforge.net/">http://pmw.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Interface graphique</td>
<td>Tkinter 3000</td>
<td><a href="http://effbot.org/zone/wck.htm">http://effbot.org/zone/wck.htm</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Interface graphique</td>
<td>Tix</td>
<td><a href="http://tix.sourceforge.net/">http://tix.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Base de données</td>
<td>MySQLdb</td>
<td><a href="http://sourceforge.net/projects/mysql-python">http://sourceforge.net/projects/mysql-python</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Base de données</td>
<td>Gadfly</td>
<td><a href="http://gadfly.sourceforge.net/">http://gadfly.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Base de données</td>
<td>psycopg</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Base de données</td>
<td>kinterbasdb</td>
<td><a href="http://kinterbasdb.sourceforge.net/">http://kinterbasdb.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Base de données</td>
<td>cx_Oracle</td>
<td><a href="http://www.cxtools.net/default.aspx?nav=downloads">http://www.cxtools.net/default.aspx?nav=downloads</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Base de données</td>
<td>pySQLite</td>
<td><a href="http://initd.org/tracker/pysqlite">http://initd.org/tracker/pysqlite</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>MSN Messenger</td>
<td>msnlib</td>
<td><a href="http://auriga.wearlab.de/%7Ealb/msnlib/">http://auriga.wearlab.de/~alb/msnlib/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>MSN Messenger</td>
<td>msnp</td>
<td><a href="http://msnp.sourceforge.net/">http://msnp.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Images</td>
<td>PIL</td>
<td><a href="http://www.pythonware.com/products/pil/">http://www.pythonware.com/products/pil/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Images</td>
<td>gdmodule</td>
<td><a href="http://newcenturycomputers.net/projects/gdmodule.html">http://newcenturycomputers.net/projects/gdmodule.html</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Images</td>
<td>VideoCapture</td>
<td><a href="http://videocapture.sourceforge.net/">http://videocapture.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Sciences et Mathématiques</td>
<td>scipy</td>
<td><a href="http://www.scipy.org/">http://www.scipy.org/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Sciences et Mathématiques</td>
<td>NumPy</td>
<td><a href="http://numpy.scipy.org//">http://numpy.scipy.org//</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Sciences et Mathématiques</td>
<td>numarray</td>
<td><a href="http://www.stsci.edu/resources/software_hardware/numarray">http://www.stsci.edu/resources/software_hardware/numarray</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Sciences et Mathématiques</td>
<td>matplotlib</td>
<td><a href="http://matplotlib.sourceforge.net/">http://matplotlib.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Jeu video</td>
<td>Pygame</td>
<td><a href="http://www.pygame.org/news.html">http://www.pygame.org/news.html</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Jeu video</td>
<td>Soya 3D</td>
<td><a href="http://home.gna.org/oomadness/fr/soya/index.html">http://home.gna.org/oomadness/fr/soya/index.html</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Jeu video</td>
<td>pyOpenGL</td>
<td><a href="http://pyopengl.sourceforge.net/">http://pyopengl.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Jabber</td>
<td>jabberpy</td>
<td><a href="http://jabberpy.sourceforge.net/">http://jabberpy.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Web</td>
<td>scrape</td>
<td><a href="http://zesty.ca/python/scrape.html">http://zesty.ca/python/scrape.html</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Web</td>
<td>pythonweb</td>
<td><a href="http://www.pythonweb.org/">http://www.pythonweb.org/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Web</td>
<td>mechanize</td>
<td><a href="http://wwwsearch.sourceforge.net/mechanize/">http://wwwsearch.sourceforge.net/mechanize/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Localisation</td>
<td>geoname.py</td>
<td><a href="http://www.zindep.com/blog-zindep/Geoname-python/">http://www.zindep.com/blog-zindep/Geoname-python/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Port Serie</td>
<td>pySerial</td>
<td><a href="http://pyserial.sourceforge.net/">http://pyserial.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Port Serie</td>
<td>USPP</td>
<td><a href="http://ibarona.googlepages.com/uspp">http://ibarona.googlepages.com/uspp</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Port Parallèle</td>
<td>pyParallel</td>
<td><a href="http://pyserial.sourceforge.net/pyparallel.html">http://pyserial.sourceforge.net/pyparallel.html</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Port USB</td>
<td>pyUSB</td>
<td><a href="http://bleyer.org/pyusb/">http://bleyer.org/pyusb/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Windows</td>
<td>ctypes</td>
<td><a href="http://starship.python.net/crew/theller/ctypes/">http://starship.python.net/crew/theller/ctypes/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Windows</td>
<td>pywin32</td>
<td><a href="http://sourceforge.net/projects/pywin32/">http://sourceforge.net/projects/pywin32/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Windows</td>
<td>pywinauto</td>
<td><a href="http://www.openqa.org/pywinauto/">http://www.openqa.org/pywinauto/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Windows</td>
<td>pyrtf</td>
<td><a href="http://pyrtf.sourceforge.net/">http://pyrtf.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Windows</td>
<td>wmi</td>
<td><a href="http://timgolden.me.uk/python/wmi.html">http://timgolden.me.uk/python/wmi.html</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>PDA/GSM/Mobiles</td>
<td>pymo</td>
<td><a href="http://www.awaretek.com/pymo.html">http://www.awaretek.com/pymo.html</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>PDA/GSM/Mobiles</td>
<td>pyS60</td>
<td><a href="http://sourceforge.net/projects/pys60">http://sourceforge.net/projects/pys60</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Son</td>
<td>pySonic</td>
<td><a href="http://pysonic.sourceforge.net/">http://pysonic.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Son</td>
<td>pyMedia</td>
<td><a href="http://pymedia.org/">http://pymedia.org/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Son</td>
<td>FMOD</td>
<td><a href="http://www.fmod.org/">http://www.fmod.org/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Son</td>
<td>pyMIDI</td>
<td><a href="http://www.cs.unc.edu/Research/assist/developer.shtml">http://www.cs.unc.edu/Research/assist/developer.shtml</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>GMail</td>
<td>libgmail</td>
<td><a href="http://libgmail.sourceforge.net/">http://libgmail.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Google</td>
<td>pyGoogle</td>
<td><a href="http://pygoogle.sourceforge.net/">http://pygoogle.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Expect</td>
<td>pyExpect</td>
<td><a href="http://pexpect.sourceforge.net/">http://pexpect.sourceforge.net/</a></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>WordNet</td>
<td>pyWordNet</td>
<td><a href="http://osteele.com/projects/pywordnet/">http://osteele.com/projects/pywordnet/</a></td>
<td>&nbsp;</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.lyxia.org/blog/developpement/python/quelques-modules-python-6/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
