Utilisation de l'interpréteur php

Eléphant du PHP | 447 Messages

31 mars 2011, 10:58

Hello every one!

Je bosse actuellement sur une petite application en python dont le but est de tester du code php...

La méthode que j'emploie est lourde, et il y a certainement un meilleur moyen de parvenir à mes fins. Explication:

* l'application est un GUI (wxPython pour la bibliothèque) contenant 2 champs; le 1er sert à saisir le code (avé la coloration syntaxique!), et le 2ème sert à afficher le résultat
* je récupère en une chaine de caractère le code saisi et je procède comme suit, j'utilise php cli via la commande system de python:

Code : Tout sélectionner

system("php -r '" + s2p + "' > " + sys.path[0] + "/files/temp.txt")
s2p est la chaine de caractère... (+ est l'opérateur de concaténation en python).


Ensuite je lis le contenu de temp.txt pour l'afficher dans le "champ de résultat".


N'y a-t-il pas un meilleur moyen d'envoyer du code à l'interpréteur php et de récupérer le résultat?


Mon système fonctionne, mais je trouve ça lourd... Et puis ça pose des problèmes avec les quotes, je peux utiliser que des guillemets en l'état.


Votre aide sera la bienvenue! Merci d'avance.
Probably (only a) Human Problem?

Mammouth du PHP | 19672 Messages

02 avr. 2011, 00:04

Salut,
ma question pourrait paraître candide, mais bon : pourquoi ne pas tester directement ton code PHP avec le client en ligne de commande sans passer du tout par Python ??

En d'autres termes, quelle est l'idée générale de cette procédure ? Peut-être qu'à partir de là il sera possible de t'indiquer des méthodes existantes moins compliquées :?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 447 Messages

02 avr. 2011, 07:16

Hello cyrano, merci pour ton message! :) Pour te répondre une image devrait suffire:

Image

Voilà le but de mon application, tester du code php via un gui plutôt que dans une console...
Probably (only a) Human Problem?

Mammouth du PHP | 19672 Messages

02 avr. 2011, 08:18

Intéressant, j'avais un outil du genre intégré dans Web-Expert mais je n'utilise plus ce truc depuis longtemps et il est vrai que devoir enregistrer un fichier pour juste tester quelques lignes finir par me créer des archives de fichiers conséquentes..
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 447 Messages

02 avr. 2011, 09:14

Surtout que dans mon appli tu peux écrire directement le code dans le champ de gauche (tu peux bien sûr aussi ouvrir des fichiers).

Bref, maintenant la question c'est quel est la meilleure manière d'envoyer ce code à l'interpreteur php et de récupérer le résultat?
Probably (only a) Human Problem?

Mammouth du PHP | 19672 Messages

02 avr. 2011, 09:22

Sur ce coup là, je ne te serai guère utile, je n'écris pas du tout en python :?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 447 Messages

02 avr. 2011, 13:52

Merci quand même! C'est sympa déjà d'avoir pris le temps de regarder le sujet.


Une question au passage: sais-tu s'il y a un moyen d'utiliser à la fois des apostrophes et des guillemets dans du code passé à php cli avec l'option -r?

Explication:

Si je fais "$ php -r 'echo 'okay'; echo "okay";'

ça ne marchera pas bien sûr... Cependant j'ai besoin de pouvoir utiliser à la fois simples et doubles quotes dans un même code, or je suis pourtant bien obligé d'utiliser l'un ou l'autre comme délimiteur du code lorsqu'il est passé avec l'option -r...
Probably (only a) Human Problem?

Mammouth du PHP | 19672 Messages

02 avr. 2011, 14:41

le client fonctionne comme le module, les règles d'alternance entre apostrophes et guillemets sont donc les mêmes, et l'utilisation de caractères d'échappement devraient être tout aussi valables.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 447 Messages

02 avr. 2011, 14:49

le client fonctionne comme le module, les règles d'alternance entre apostrophes et guillemets sont donc les mêmes, et l'utilisation de caractères d'échappement devraient être tout aussi valables.
Hélas non... Fais des essais.
Probably (only a) Human Problem?

Mammouth du PHP | 19672 Messages

02 avr. 2011, 17:14

Attends, je sens qu'il y a confusion :
Si je fais "$ php -r 'echo 'okay'; echo "okay";'
Cette ligne de code n'a pas de sens effectivement, mais si je saisis bien, c'est la commande que tu traites en python pour que le client PHP reçoive. Donc coté python il y a certainement aussi des règles d'alternances de caractères d'encadrement. Si tu débutes la chaine avec une apostrophe, la prochaine apostrophe sera interprétée par Python comme la fin de la chaine. Si dans le code PHP qui est dans cette chaine il y a une apostrophe, elle devra être échappée, mais en python, pas en PHP.

Je ne connais pas du tout le python, mais ça devrait ressembler à quelque chose comme ça :

Code : Tout sélectionner

$ php -r 'echo \'okay\'; echo "okay";'
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 447 Messages

02 avr. 2011, 17:31

Oui j'y ai pensé bien sûr à échapper les apostrophes. Mais à ce moment du programme python passe la main à php, j'envoie ma commande à ce dernier via la fonction "system" de python. Donc échappement ou pas ça ne change rien, c'est php cli qui gère le bousin et là les apostrophes échapées, ça passe pas...

Ma solution actuelle c'est d'écrire dans un fichier le code que l'utilisateur veut tester puis de soumettre ce fichier avec php -f.
Ça en fait des manips...

1) J'écris le code php dans un fichier
2) Je lance php cli en lui passant ce fichier
3) J'écris le résultat dans un autre fichier
4) J'ouvre ce dernier pour récupérer ce résultat


Je suis qu'il doit y avoir une meilleure manière de procéder, mais mes connaissances s'arrêtent là.

V'là le code python de la méthode concernée (juste pour le plaisir et le fun):

Code : Tout sélectionner

#Tester code def OnTest(self, e): s2p = self.wysiwyg.GetText() s2p.rstrip() if s2p != "": tmp = open(sys.path[0] + "/files/tmp.php", "w") tmp.write(s2p) tmp.close() temp = system("php -f " + sys.path[0] + "/files/tmp.php > " + sys.path[0] + "/files/temp.txt") f = open(sys.path[0] + "/files/temp.txt", "r") l = '' s2p2 = self.result.Value tempstr = "" for l in f: tempstr += l self.result.SetValue(tempstr) self.SetStatusText("Tested...") f.close() f = open(sys.path[0] + "/files/temp.txt", "w") f.write("") f.close() else: self.result.SetValue("Rien à tester...") self.SetStatusText("Le champ \"Entrée\" est vide...")
Probably (only a) Human Problem?