Python tips & tricks

Depuis quelques temps, je développe pas mal en python et durant mes différents projets, j’ai rencontré tout un tas de petits problèmes ou besoins.

Je me suis donc dis que cela pourrait être intéressant de regrouper en vrac dans un article quelques unes des solutions trouvées. Non seulement cela vous servira peut être un jour, mais en plus, vous aurez peut être des solutions plus simples/adaptées à me proposer ;)

Opérateur ternaire

J’utilise souvent en php l’opérateur ternaire (x ? a : b) et je voulais trouver une équivalence en python.
Ma première réaction a été de faire simplement un :

 

bool(x) and a or b

Mais si « a » est un booléen à false, cela ne fonctionne pas comme le montre le petit test ci-dessous :

J’ai donc cherché plus en profondeur et j’ai trouvé une solution des plus simple en utilisant une liste avec 2 valeurs :

[a, b][bool(x)]

Suivant la valeur de « x », la valeur retournée sera la 0 ou la 1.

 

Récupérer son adresse IP publique

En python, pas possible de faire comme en PHP en utilisant $_SERVER['REMOTE_ADDR'] pour afficher l’IP. Il fallait donc trouver une solution, et après plusieurs minutes de recherche, la seule solution vraiment valable que j’ai trouvé, est toute simple.

 

from urllib2 import urlopen
public_ip = urlopen('http://whatismyip.org').read()

N.B: l’idéal serait d’utiliser un try … except pour faire propre mais bon, ca c’est à vous de le faire

Si vous connaissez une autre solution, je suis preneur ;)

 

Un serveur web instantané

Envie de partager un ou plusieurs fichiers avec quelqu’un sans devoir le mettre sur une url publique (ex: www.mondomaine.com/fichier_pour_toi.png) ou créer un compte FTP ? Envie d’analyser vos requêtes http ? Autre envie ?

Python vous permet en une ligne de commande de réaliser un serveur web :

 

python -c "import SimpleHTTPServer;SimpleHTTPServer.test()"

Il vous suffit ensuite de vous connecter sur l’ip de votre serveur sur le port 8000 et naviguer dans l’arborescence du répertoire ou la commande à été lancée :

Pour arrêter le serveur, un petit « CTRL+C » dans votre shell et c’est fini ;)

N.B: il est tout a fait possible en une dizaine de lignes de faire un serveur un peu plus abouti avec notamment une gestion du port.

 

Envoyer un fichier par sftp

Envoyer un fichier (backup, sources …) d’un serveur à un autre est possible de différente façon (FTP, webdav …) mais une des manière les plus sécurisées et sans installation supplémentaire (quand le serveur autorise les accès ssh) reste pour moi le sftp.

Et j’ai trouvé « paramiko » qui existe en paquet debian, donc un simple « apt-get install python-paramiko » et hop.

Le code :

 

import paramiko
 
host = '127.0.0.1'
port = 22
transport = paramiko.Transport((host, port))
 
user = 'mon_user'
pass = 'mon_pass'
transport.connect(username = user, password = pass)
 
sftp = paramiko.SFTPClient.from_transport(transport)
 
import sys
path = sys.argv[2]
localpath = sys.argv[1]
sftp.put(localpath, path)
 
sftp.close()
transport.close()
print 'Upload done.'

Ensuite il suffit de lancer le script :

 

python send_over_sftp.py /chemin/local/fichier.txt /chemin/distant/fichier.txt

Et c’est tout :)

N.B: A noter qu’il est préférable de configurer ses serveurs pour fonctionner avec des clefs plutot que de mettre le password en clair dans le script python et de sécuriser les paramètres envoyés au script si vous donnez l’utilisation à d’autres utilisateurs.

 

PHP to PYTHON

Pour finir, un petit lien très pratique qui vous permet de voir l’équivalence python des fonctions php (quand elle existe) : http://www.php2python.com/

Tags: , , , ,

A propos de l'auteur

Développeur web & système spécialisé en sécurité. Passionné par tout ce qui touche au web et la sécurité informatique, vous pouvez le retrouvez sur twitter.

Vous avez aimé ce billet? Faites le savoir!

  • Delicious
  • Twitter
  • Technorati Favorites
  • FriendFeed
  • Google Bookmarks
  • Share

2 Réponses

  1. Tonio 27 septembre 2011 à 11 h 23 min #

    En passant:

    `python -m SimpleHTTPServer` est plus court.

    Pour le ternaire:

    a = ‘b’ if True else ‘c’

    Mes 0.02€ :)

  2. Florian Klein 14 octobre 2011 à 10 h 14 min #

    Hello, oui y’a surement plus simple pour récupérer son ip :)

    import socket
    print socket.gethostbyname(socket.gethostname())


Laisser un message