Appeler Curl depuis un program Python 3.1


Curl (un client HTTP en ligne de commande) est très pratique à utiliser pour tester manuellement les requêtes Rest. Il permet en particulier de manipuler les headers ou les méthodes HTTP.

Par exemple :

# envoi des données en JSON en paramétrant le header
curl -i -H 'Content-Type: application/json'
-d '{"items":[{"title": "AAA AAA", "description": "aaa aaa aaa",
"link": "http:AAA.com"}]}'  http://${SERVER}/rest/messages

# suppression du message avec la methode DELETE
curl -X DELETE http://${SERVER}/rest/messages/1

J’ai fait un petit programme Python pour faciliter la construction des différentes requêtes Rest. Le programme Python permet de sélectionner le server GAE local/remote, le type d’opération, le variant pour l’input, l’output demandé et saisir les données à envoyer.

 

Appeler Curl m’a posé quelques problèmes.

Pycurl (une intégration curl/python) n’existe pas pour python 3.1. J’ai donc implémenté les appels de commande externes directement en Python. Mais j’ai eu un peu de mal à trouver les informations car les I/O Python ont pas mal changées au cours du temps. Voici le code qui permet d’appeler une commande et récupérer la sortie standard en Python 3.1.

runCommand

On utilise Popen du module subprocess. La méthode communicate() crée un tableau où 0 contient la sortie standard et 1 la sortie erreur.
Si vous voulez rediriger la sortie erreur sur la sortie standard, utilisez stderr=STDOUT.
Pour une raison qui m’échappe le passage de la commande en tableau a cessé de fonctionner, mais la concaténation de chaînes à résolu ce problème.

2 réflexions sur “Appeler Curl depuis un program Python 3.1

  1. Bonjour

    Je pense également à utiliser curl via subprocess plutôt que via pyCurl, mais qu’en penser ? C’est moins pythonique mais c’est quand même drôlement plus simple et clair au final. Et niveau performances cela change quelque chose ? Bref si vous aviez quelques arguments pour/contre cela m’intéresse.

    Fred

    • C’est probablement plus simple et via pyCurl, mais en l’occurrence ne j’avais pas envie de revenir en 2.6 pour faire marcher uniquement cette ligne.
      Pour le reste je n’en sait rien. Si pyCurl appelle un process Curl cela revient au même.

Laisser un commentaire