Eseguire uno script python all'interno di wordpress
-
-
Se è uno scriptmolto semplice,penso che lo riscriverei semplicementein PHP come unplugin/modello di WordPress ;-) Main alcuni casi lepersone usanoiframeperincorporarepagineesterne.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 direttamente?:]iframe it directly? :]
- 0
- 2013-10-27
- Jesse
-
È solo unincidente oiltuo codice Python è davveromescolato con PHP?Is this just an accident, or is your python code really mixed with PHP?
- 0
- 2013-11-05
- fuxia
-
Hoincollato latraccia delterminale,coni file visualizzati dal comando 'more' ... riordinerò unpo '...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 risposta
- voti
-
- 2013-10-27
Puoi utilizzare
popen ()
per leggi o scriviin uno script Python (funziona anche con qualsiasi altro linguaggio). Se haibisogno diinterazione (passaggio di variabili) usaproc_open ()
.Un sempliceesempioper stampare Hello World! in unplug-in di WordPress
Creailplugin,registra uno shortcode:
& lt;?php # - * - coding: utf-8 - * - /* Nomeplug-in: Pythonincorporato */ add_shortcode ('python','embed_python'); funzioneembed_python ($ attributi) { $ data=shortcode_atts ( [ 'file'=> "ciao.py" ], $ attributi ); $ handle=popen (__DIR__. '/'. $ data ['file'],'r'); $ read=''; while (!feof ($ handle)) { $ letto.=fread ($ handle,2096); } pclose ($ handle); return $ read; }
Orapuoi utilizzare quello shortcodenell'editor deipost con
[python]
o[pythonfile="filename.py"]
.Mettigli script Python che desideri utilizzarenella stessa directory delfile delplugin. Puoi anchemetterliin una directorye modificareilpercorsonelgestore dello shortcode.
Ora crea uno script Python complesso come questo:
print ("Hello World!")
E questo ètutto. Usa lo shortcodee ottieni questo output:
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 risposta corretta omette quellaprima riga dello scriptpython,almenonelmio caso,deveessere #!/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 Dipende dal sistema dell'utente,quindi l'ho lasciatofuori deliberatamente.@MikeiLL That depends on the user’s system, so I left it out deliberately.
- 1
- 2014-05-20
- fuxia
-
fondamentalmentefacendo unbuco di sicurezza.Sepuoieseguireilpipe su Python,puoi ancheeseguireilpipe su qualsiasi altroprocessoe questopuòessere usatoper aumentare qualsiasiexploitpiùbanale.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 sì,questanon è unabuonaidea.Perfare questo "bene" ci saràbisogno di un comando diescapein entratae di JavaScript + PHP diescapein corso.Questonon è unbuonmodoper sviluppare qualcosa all'interno di WordPress,ameno chenon ci sia una ragione MOLTO specificaperfarlo."Ituoi -scientisti-programmatorierano cosìpreoccupati sepotevano omeno,non si sonofermati apensare se dovevano."@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
Ho seguito lo script diesempio dallaprima risposta,manon ho ricevuto alcun output oerrori.
Ho cambiato questa riga:
$handle = popen( __DIR__ . '/' . $data['file'], 'r' );
a questo:
$handle = popen( __DIR__ . '/' . $data['file'] . ' 2>&1', 'r' );
e poi ha ricevuto unmessaggio di "autorizzazionenegata".
Sulla console,hoeseguito
chmod 777 hello.py
ha aggiornato lapaginae tutto hafunzionatoperfettamente.
Questopotrebbeessereilproblema che Joe stava riscontrando sopra.Non ho abbastanza rappresentanteperfare un commento,mi dispiace.Spero che questo aiuti qualcuno.
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.
-
Non rendereilpermesso 777. Rendilo semplicementeeseguibile.`chmod + xnomefile.py` andràbeneDo 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
Ecco unpiccolo script che utilizza
proc_open
comeindicato sopra,perinviare una semplice variabile ditesto a uno script Python: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
Aggiunti alcunitestin fondoper vedere seilfilepython è
rwx
. Penso che unmodomiglioreperinviareargv
sarebbe usarefwrite,manon hafunzionatoperme seguendo questotutorial .Ecco lo scriptpython che ho usato. Comenotatonei commenti sopra,potrebbeesserenecessario qualcosa come
#!/usr/bin/env python
,a seconda del 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
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
Ho un'installazione di WordPressper unblogpersonalee stogradualmenteportandotuttii piccolibit web che ho scrittonel corso degli anni allepagine delblog.
Una di questepagine è http://www.projecttoomanycooks.co. uk/cgi-bin/memory/majorAnalysis.py che è un semplice scriptpython che restituisce unelenco diparole -mi piacerebbeincorporare quel comportamentoin unapagina wordpress - qualcunopotrebbeindicarmiilmodoeasyista dieseguire unpunto dipython all'interno di wordpress?
MODIFICA - seguendo lameravigliosa risposta di seguito,homolto altro ...ma sfortunatamentenon ci sono ancora deltutto ...
Hopython che vieneeseguito sul server ...
ed ènella stessa directory delplugin attivato ...
Il codicepython ... che hail seguente codice ...
Ilphp: