123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- <!doctype html>
- <html lang=fr>
- <head>
- <!-- Always define the charset before the title -->
- <meta charset=utf-8>
- <title>Un projet Python : de l'idée à la publication — Biologeek — David Larlet</title>
- <!-- Define a viewport to mobile devices to use - telling the browser to assume that the page is as wide as the device (width=device-width) and setting the initial page zoom level to be 1 (initial-scale=1.0) -->
- <meta name="viewport" content="width=device-width, initial-scale=1"/>
- <!-- Fake favicon, to avoid extra request to the server -->
- <link rel="icon" href="data:;base64,iVBORw0KGgo=">
- <link type="application/atom+xml" rel="alternate" title="Feed" href="/david/log/" />
- <link rel="manifest" href="/manifest.json">
-
- <link rel="stylesheet" href="/static/david/css/larlet-david-_J6Rv.css" data-instant-track />
-
- <noscript>
- <style type="text/css">
- /* Otherwise fonts are loaded by JS for faster initial rendering. See scripts at the bottom. */
- body {
- font-family: 'EquityTextB', serif;
- }
- h1, h2, h3, h4, h5, h6, time, nav a, nav a:link, nav a:visited {
- font-family: 'EquityCapsB', sans-serif;
- font-variant: normal;
- }
- </style>
- </noscript>
-
- <!-- Canonical URL for SEO purposes -->
- <link rel="canonical" href="https://larlet.fr/david/biologeek/archives/20101203-un-projet-python-de-lidee-la-publication">
-
- </head>
- <body>
- <div>
-
- <header>
- <nav>
- <p>
- <small>
- Je suis <a href="/david/" title="Profil public">David Larlet</a>, <a href="/david/pro/" title="Activité professionnelle">artisan</a> du web qui vous <a href="/david/pro/accompagnement/" title="Activité d’accompagnement">accompagne</a><span class="more-infos"> dans l’acquisition de savoirs pour concevoir des <a href="/david/pro/produits-essentiels/" title="Qu’est-ce qu’un produit essentiel ?">produits essentiels</a></span>. <span class="more-more-infos">Discutons ensemble d’une <a href="/david/pro/devis/" title="En savoir plus">non-demande de devis</a>.</span> Je partage ici mes <a href="/david/blog/" title="Expériences bienveillantes">réflexions</a> et <a href="/david/correspondances/2017/" title="Lettres hebdomadaires">correspondances</a>.
- </small>
- </p>
- </nav>
- </header>
-
-
- <section>
- <h1 property="schema:name">Un projet Python : de l'idée à la publication</h1>
- <article typeof="schema:BlogPosting">
- <div property="schema:articleBody">
- <img src="/static/david/biologeek/images/logos/graphe-social.png" alt="vignette" style="float:left; margin: 0.5em 1em;" property="schema:thumbnailUrl" />
- <p>J'aime coder en Python mais pas uniquement pour l'esthétique ou la puissance du langage, j'apprécie l'écosystème me permettant de concrétiser une idée en quelques commandes. Je vais prendre un exemple concret avec l'idée du jour qui était de créer un triple store à partir de redis_graph suite à <a href="http://twitter.com/#!/rgaidot/status/10317008201580544">un tweet de Régis Gaidot</a>.</p>
- <p>Au final, je n'aurais pas utilisé redis_graph car l'implémentation utilisant des sets était limitante et je préférais avoir recours à des hashs mais ce n'est pas l'objet du billet. Je vais essayer de décrire commande par commande ce que j'ai pu faire cette après midi.</p>
- <h2>Initialisation</h2>
- <p>On commence par installer redis, pour ça l'utilisation de <a href="http://mxcl.github.com/homebrew/">homebrew</a> sur mac est vraiment une bénédiction quand on a connu la puissance d'apt-get...</p>
- <pre><code>$ brew install redis
- </code></pre>
- <p>Et ensuite il faut un peu deviner comment lancer le serveur (bon ok, ou lire la doc), tiens il y a des redis-* dans mon path, essayons redis-server, bingo ! Et voilà notre serveur de test lancé, pas trop besoin de se préoccuper de la configuration pour l'instant.</p>
- <p>Passons à l'environnement Python, ici on utilise <a href="http://virtualenv.openplans.org/">virtualenv</a> (associé à <a href="http://www.doughellmann.com/projects/virtualenvwrapper/">virtualenvwrapper</a>) qui est la solution miracle que tout le monde attendait pour avoir des environnements Python virtuels indépendants. Et on installe les dépendances :</p>
- <pre><code>$ mkvirtualenv redis_triplestore --no-site-packages
- $ cd your/path/
- $ workon redis_triplestore
- $ pip install -e git+https://github.com/andymccurdy/redis-py.git#egg=redispy
- $ pip install redis_wrap
- $ pip install redis_graph
- </code></pre>
- <p>Pour éviter d'avoir à installer les dépendances à la main pour notre projet, on génère tout de suite un fichier requirements.txt qui permettra de faire ça en une fois :</p>
- <pre><code>$ pip freeze > requirements.txt
- </code></pre>
- <p>Il y a l'<a href="http://blog.akei.com/post/573774396/installer-django-dans-un-environnement-python-virtuel">excellent billet de Nico</a> si vous voulez un peu plus de détail sur tout ça.</p>
- <h2>Développement</h2>
- <p>Ici vous commencez à coder votre idée, pas grand chose à dire là-dessus. J'ai décidé de mettre directement les tests dans le fichier car je voulais que ça tienne dans un snippet avant d'en faire un vrai projet.</p>
- <p>J'ai juste encore une fois été étonné par la rapidité de Redis, au point de me demander au début si mes tests étaient bien évalués !</p>
- <p>Je trouve ça élégant de pouvoir concrétiser une idée en une cinquantaine de lignes, juste pour le fun ;-).</p>
- <h2>Publicaiton</h2>
- <p>Si j'hésite à publier ce genre de bêtise codée en 2h c'est car ça implique une certaine responsabilité et maintenance qui est chronophage (et pas vraiment enthousiasmante non plus...). Mais je me dis que ça peut être utile, au même titre que redis_wrap dont je me suis servi avec satisfation.</p>
- <p>Ici c'est l'étape technique du setup.py qui consiste généralement en un copier/coller d'un autre/ancien projet qu'il faut adapter. Pour vérifier qu'il fonctionne bien :</p>
- <pre><code>$ python setup.py sdist
- </code></pre>
- <p>Ok, votre paquet est créé, commençons par mettre le code quelque part. Ça dépend de vos préférences, je préfère mercurial donc je pousse ça sur <a href="https://bitbucket.org/">Bitbucket</a> :</p>
- <pre><code># Création du dépôt sur Bitbucket
- $ hg init .
- $ mate .hg/hgrc
- # Ajout de l'URL du dépôt
- $ hg add
- $ hg ci -m "Initial implementation"
- $ hg tag "0.1"
- $ hg push
- </code></pre>
- <p>Vous pouvez faire les premières étapes dans un autre ordre mais de mémoire, si vous clonez et que vous avez déjà un dossier du même nom correspondant au projet, ça va râler.</p>
- <p>Finalisons le setup.py avec 2/3 urls et enregistrons le projet sur pypi :</p>
- <pre><code>$ python setup.py register
- $ python setup.py sdist upload
- </code></pre>
- <p>Et voilà ! Votre projet est <a href="http://code.welldev.org/redis_triplestore">accessible à tous</a> et <a href="http://pypi.python.org/pypi/redis_triplestore">installable par tous</a>, il ne reste plus qu'à en faire la promotion :-).</p>
- </div>
- </article>
- <footer>
- <h6 property="schema:datePublished">— 03/12/2010</h6>
- </footer>
- </section>
- <section>
- <div>
- <h3>Articles peut-être en rapport</h3>
- <ul>
- <li><a href="/david/biologeek/archives/20110426-bilan-sur-les-rencontres-django-2011/" title="Accès à Bilan sur les rencontres Django 2011">Bilan sur les rencontres Django 2011</a></li>
- <li><a href="/david/biologeek/archives/20101210-format-de-conference-pour-les-rencontres-django-2011/" title="Accès à Format de conférence pour les rencontres Django 2011">Format de conférence pour les rencontres Django 2011</a></li>
- <li><a href="/david/biologeek/archives/20101130-de-lopendata-au-linkeddata-exemple-de-nosdonneesfr/" title="Accès à ★ De l'OpenData au LinkedData : exemple de nosdonnees.fr">★ De l'OpenData au LinkedData : exemple de nosdonnees.fr</a></li>
- </ul>
- </div>
- </section>
- <section>
- <div id="comments">
- <h3>Commentaires</h3>
-
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">Julien</span> le <span class="comment-date" property="schema:commentTime">17/12/2010</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Python un langage apoptotique que plus personne de sérieux ne peut envisager utiliser.</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">19/12/2010</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Et pourtant il a gagné une place cette année sur l'index TIOBE qui confirme la progression :<br /><a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html</a></p>
-
- <p>Comme quoi...</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">RT</span> le <span class="comment-date" property="schema:commentTime">12/01/2011</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Le magnifique Python a un avenir un peu flou, mais tant qu'il reste promu par Google (entre autres), son apoptose reste hypothétique.</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">12/01/2011</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>"un peu flou" ?!</p>
-
- <p>C'est le langage de l'année pour TIOBE quand même, il faut arrêter de croire que le Python est peu utilisé…</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">RT</span> le <span class="comment-date" property="schema:commentTime">12/01/2011</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Le "flou" du post précédent ne qualifiait pas l'adhésion des programmeurs envers Python, mais concernait la promotion de 3.0 ou 3.1 qui me semble assez peu utilisé aujourd'hui par rapport à une 2.4, 2.5 (celle utilisé pour appengine par exemple) ou plus.</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">Daniel</span> le <span class="comment-date" property="schema:commentTime">22/11/2011</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Ah le python quel doux langage.</p>
-
- <p>En ce qui me concerne dés qu'il est question d'écrire un peut de code je l'utilise.</p>
-
- <p>En quelques lignes on a quelques choses de fonctionnel.</p>
- </div>
- </div>
-
- </div>
- </section>
-
-
- <footer>
- <nav>
- <p>
- <small>
- Je réponds quasiment toujours aux <a href="mailto:david%40larlet.fr" title="Envoyer un email">emails</a> (<a href="/david/signature/" title="Ma signature actuelle avec possibilité de chiffrement">signés</a>) et vous pouvez me rencontrer à Montréal. <span class="more-infos">N’hésitez pas à <a href="/david/log/" title="Être tenu informé des mises à jour">vous abonner</a> pour être tenu informé des publications récentes.</span>
- </small>
- </p>
- </nav>
- </footer>
-
- </div>
-
- <script src="/static/david/js/larlet-david-3ee43f.js" data-no-instant></script>
-
- <script data-no-instant>InstantClick.init()</script>
-
- </body>
- </html>
|