Exécution d'un script python dans wordpress
-
-
Si c'est un scripttrès simple,je pense queje le réécrirais simplementen PHPen tant queplugin/modèle WordPress ;-) Mais dans certains cas,lesgens utilisent desiframespourintégrer despagesexternes.If it's a very simple script, I think I would just rewrite it in PHP as a WordPress plugin/template ;-) But in some cases people use iframes to embed external pages.
- 1
- 2013-10-27
- birgire
-
iframe-le directement?:]iframe it directly? :]
- 0
- 2013-10-27
- Jesse
-
Est-cejuste un accident ou votre codepythonest-il vraimentmélangé avec PHP?Is this just an accident, or is your python code really mixed with PHP?
- 0
- 2013-11-05
- fuxia
-
J'ai collé latrace duterminal,lesfichiers étant affichéspar la commande ``plus '' ...je vais ranger unpeu ...I pasted the terminal trace, with the files being displayed by the 'more' command... will tidy up a little...
- 0
- 2013-11-05
- Joe
-
3 réponses
- votes
-
- 2013-10-27
Vouspouvez utiliser
popen()
pour lire ou écrire dans un script Python (celafonctionne également avecn'importe quel autre langage). Si vous avezbesoin d'interaction (passer des variables),utilisezproc_open()
.Unexemple simplepourimprimer Hello World! dans unplugin WordPress
Créez leplugin,enregistrez un shortcode:
<?php # -*- coding: utf-8 -*- /* Plugin Name: Python embedded */ add_shortcode( 'python', 'embed_python' ); function embed_python( $attributes ) { $data = shortcode_atts( [ 'file' => 'hello.py' ], $attributes ); $handle = popen( __DIR__ . '/' . $data['file'], 'r' ); $read = ''; while ( ! feof( $handle ) ) { $read .= fread( $handle, 2096 ); } pclose( $handle ); return $read; }
Vouspouvezmaintenant utiliser ce shortcode dans l'éditeur depublication avec
[python]
ou[python file="filename.py"]
.Placez les scripts Python que vous souhaitez utiliser dans lemême répertoire que lefichier duplugin. Vouspouvez également lesmettre dans un répertoireet ajuster le chemin dans legestionnaire de shortcode.
Maintenant,créez un script Python complexe comme celui-ci:
print("Hello World!")
Et c'esttout. Utilisez le shortcodeet obtenez cette sortie:
You can use
popen()
to read or write to a Python script (this works with any other language too). If you need interaction (passing variables) useproc_open()
.A simple example to print Hello World! in a WordPress plugin
Create the plugin, register a shortcode:
<?php # -*- coding: utf-8 -*- /* Plugin Name: Python embedded */ add_shortcode( 'python', 'embed_python' ); function embed_python( $attributes ) { $data = shortcode_atts( [ 'file' => 'hello.py' ], $attributes ); $handle = popen( __DIR__ . '/' . $data['file'], 'r' ); $read = ''; while ( ! feof( $handle ) ) { $read .= fread( $handle, 2096 ); } pclose( $handle ); return $read; }
Now you can use that shortcode in the post editor with
[python]
or[python file="filename.py"]
.Put the Python scripts you want to use into the same directory as the plugin file. You can also put them into a directory and adjust the path in the shortcode handler.
Now create a complex Python script like this:
print("Hello World!")
And that’s all. Use the shortcode, and get this output:
-
La réponse correcte omet que lapremière ligne du scriptpython,dumoins dansmon cas,doit être #!/Usr/bin/envpythonCorrect answer omits that first line of the the python script, at least in my case, needs to be #!/usr/bin/env python
- 0
- 2014-05-19
- MikeiLL
-
@MikeiLL Cela dépend du système de l'utilisateur,je l'ai donc laissé de côté délibérément.@MikeiLL That depends on the user’s system, so I left it out deliberately.
- 1
- 2014-05-20
- fuxia
-
faisantessentiellement unefaille de sécurité.Si vouspouvez rediriger verspython,vouspouvez également rediriger versn'importe quel autreprocessuset celapeut être utilisépourescaladertoutexploitplustrivial.basically making a security hole. If you can pipe to python, you can pipe to any other process as well and this can be used to escalate any more trivial exploit.
- 1
- 2018-08-15
- Mark Kaplun
-
@MarkKaplun oui,cen'estpas unebonneidée.Pourfaire cela "correctement",ilfaudra que la commande s'échappeet que JavaScript + PHP s'échappe.Cen'estpas unbonmoyen de développer quoi que ce soit à l'intérieur de WordPress,àmoins qu'iln'y ait une raison TRÈS spécifique de lefaire."Vosprogrammeurs -cientifiques- étaienttellementpréoccupés de savoir s'ils lepouvaient ounon,ilsne se sontpas arrêtéspour se demander s'ils le devraient."@MarkKaplun yes, this is not a good idea. To do this "right" there will have to be command escaping going in, and JavaScript+PHP escaping going on. This is not a good way to develop anything inside WordPress, unless there is a VERY specific reason to do this. "Your -scientists- programmers were so preoccupied with whether or not they could, they didn’t stop to think if they should."
- 0
- 2020-01-20
- Brian Stinar
-
- 2016-10-06
J'ai suivi l'exemple de script de lapremière réponse,maisje n'obtenais aucune sortieni erreur.
J'ai changé cette ligne:
$handle = popen( __DIR__ . '/' . $data['file'], 'r' );
à ceci:
$handle = popen( __DIR__ . '/' . $data['file'] . ' 2>&1', 'r' );
et aensuite reçu unmessage "autorisation refusée".
Sur la console,j'ai couru
chmod 777 hello.py
a rafraîchi lapageet tout aparfaitementfonctionné.
C'estpeut-être leproblème que Joe voyait ci-dessus.Jen'aipas assez de représentantspourfaire un commentaire,désolé.J'espère que cela aide quelqu'un.
I followed the example script from the first answer, but was getting no output or errors.
I changed this line:
$handle = popen( __DIR__ . '/' . $data['file'], 'r' );
to this:
$handle = popen( __DIR__ . '/' . $data['file'] . ' 2>&1', 'r' );
and then got a "permission denied" message.
On the console, I ran
chmod 777 hello.py
refreshed the page, and everything worked perfectly.
This may be the issue Joe was seeing above. I don't have enough rep to make a comment, sorry. Hope this helps someone.
-
Ne rendezpas lapermission 777. Rendez-la simplementexécutable.`chmod + xfilename.py`fera l'affaireDo not make the permission 777. Just make it executale. `chmod +x filename.py` will do
- 0
- 2019-06-25
- Dheeraj M Pai
-
- 2014-05-19
Voici unpetit script qui utilise
proc_open
commeindiqué ci-dessus,pourenvoyer une simple variable detexte à un scriptpython:add_shortcode( 'execute_python', 'execute_python_with_argv' ); function execute_python_with_argv( $attributes ){ $description = array ( 0 => array("pipe", "r"), // stdin 1 => array("pipe", "w"), // stdout 2 => array("pipe", "w") // stderr ); $application_system = "python "; $application_path .= plugin_dir_path( __FILE__ ); $application_name .= "hello.py"; $separator = " "; $application = $application_system.$application_path.$application_name.$separator; $argv1 = '"output to receive back from python script"'; $pipes = array(); $proc = proc_open ( $application.$argv1 , $description , $pipes ); //echo proc_get_status($proc)['pid']; if (is_resource ( $proc )) { echo "Stdout : " . stream_get_contents ( $pipes [1] ); //Reading stdout buffer fclose ( $pipes [1] ); //Closing stdout buffer fclose ( $pipes [2] ); //Closing stderr buffer $return_value = proc_close($proc); echo "<br/>command returned: $return_value<br/>"; } $application_test = glitch_player_DIR.$application_name; echo "<br/>Is ".$application_test." executable? ".is_executable($application_test)." "; echo "readable? ".is_readable($application_test)." "; echo "writable? ".is_writable($application_test)." "; } //EOF main/shortcode function
Ajout de quelquestestsen baspour voir si lefichierpythonest
rwx
. Jepense qu'unemeilleurefaçon d'envoyer leargv
serait d'utiliserfwrite,mais celane fonctionnaitpaspourmoien suivant cetutoriel .Voici le scriptpython quej'ai utilisé. Commeindiqué dans les commentaires ci-dessus,quelque chose comme
#!/usr/bin/env python
peut êtrenécessaire,selon le serveur.#!/usr/bin/env python from sys import argv script, what_he_said = argv print "This is what you submitted: %s \n \n Isn't that amazing, man? " % what_he_said
Here's a little script that uses
proc_open
as noted above, to sent one simple text variable to a python script:add_shortcode( 'execute_python', 'execute_python_with_argv' ); function execute_python_with_argv( $attributes ){ $description = array ( 0 => array("pipe", "r"), // stdin 1 => array("pipe", "w"), // stdout 2 => array("pipe", "w") // stderr ); $application_system = "python "; $application_path .= plugin_dir_path( __FILE__ ); $application_name .= "hello.py"; $separator = " "; $application = $application_system.$application_path.$application_name.$separator; $argv1 = '"output to receive back from python script"'; $pipes = array(); $proc = proc_open ( $application.$argv1 , $description , $pipes ); //echo proc_get_status($proc)['pid']; if (is_resource ( $proc )) { echo "Stdout : " . stream_get_contents ( $pipes [1] ); //Reading stdout buffer fclose ( $pipes [1] ); //Closing stdout buffer fclose ( $pipes [2] ); //Closing stderr buffer $return_value = proc_close($proc); echo "<br/>command returned: $return_value<br/>"; } $application_test = glitch_player_DIR.$application_name; echo "<br/>Is ".$application_test." executable? ".is_executable($application_test)." "; echo "readable? ".is_readable($application_test)." "; echo "writable? ".is_writable($application_test)." "; } //EOF main/shortcode function
Added a few tests as the bottom to see if the python file is
rwx
. I think a better way to send theargv
would be using fwrite, but it wasn't working for me following this tutorial.Here is the python script I used. As noted in comments above, something like
#!/usr/bin/env python
may be necessary, depending on server.#!/usr/bin/env python from sys import argv script, what_he_said = argv print "This is what you submitted: %s \n \n Isn't that amazing, man? " % what_he_said
J'ai uneinstallation WordPresspour unblogpersonnelet jeporteprogressivementtous lespetitsbouts Web quej'ai écrits aufil des ans sur despages dublog.
L'une de cespagesest http://www.projecttoomanycooks.co. uk/cgi-bin/memory/majorAnalysis.py quiest un simple scriptpython qui renvoie une liste demots -j'aimeraisintégrer ce comportement dans unepage wordpress - quelqu'unpourrait-ilme diriger dans labonne direction lamanièreeasyist d'exécuter unpeu depython dans wordpress?
EDIT - suite à lamerveilleuse réponse ci-dessous,j'aibeaucoup àfaire ...maismalheureusementtoujourspastout àfait là ...
J'aipython qui s'exécute sur le serveur ...
et c'est dans lemême répertoire que leplugin activé ...
Le codepython ... qui a le code suivant ...
Lephp: