Executando um script Python dentro do WordPress
-
-
Se é um roteiromuito simples,acho queiria apenas reescrevê-lono PHP como umplugin/modelo do WordPress ;-) Masem alguns casos,aspessoas usamiframesparaincorporar aspáginasexternas.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 diretamente?:]iframe it directly? :]
- 0
- 2013-10-27
- Jesse
-
Isso é apenas um acidente,ou é o seu código Python realmentemisturado com o PHP?Is this just an accident, or is your python code really mixed with PHP?
- 0
- 2013-11-05
- fuxia
-
Eu colei otraço doterminal,com os arquivos sendoexibidospelo comando 'mais' ... vai arrumar umpouco ...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 respostas
- votos
-
- 2013-10-27
vocêpode usar
popen()
para Leia ou writeem um script Python (issofunciona com qualquer outroidiomatambém). Se vocêprecisar deinteração (variáveis depassagem),proc_open()
.Umexemplo simplesparaimprimir olámundo! em umplugin do WordPress
Crie oplugin,registre um 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; }
Agora vocêpode usaresse shortcodenoeditor depostagem com
[python]
ou[python file="filename.py"]
.Coloque os scripts Python que você deseja usarnomesmo diretório que o arquivoplugin. Vocêtambémpode colocá-losem um diretórioe ajustar o caminhonomanipulador de shortcode.
Agora crie um script depython complexo comoeste:
print("Hello World!")
e isso étudo. Use o shortcodee obtenhaesta saída:
.
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:
-
A resposta correta omite que aprimeira linha do script Python,pelomenosnomeu caso,precisa ser #!/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 que depende do sistema do usuário,então deixei deliberadamente.@MikeiLL That depends on the user’s system, so I left it out deliberately.
- 1
- 2014-05-20
- fuxia
-
basicamentefazendo umburaco de segurança.Se vocêpuder canalizarpara Python,vocêpode usar qualquer outroprocessotambéme issopode ser usadopara aumentar qualquerexploraçãomaistrivial.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 Sim,issonão é umaboaideia.Parafazerisso "certo",terá que haver comandoescapandoe ojavascript +phpescapando acontecendo.Estanão é umaboamaneira de desenvolver qualquer coisa dentro do WordPress,amenos que haja uma razãomuitoespecíficaparafazerisso."Os seusescrientos - osprogramadoresestavamtãopreocupados com seelespoderiam ounão,elesnãopararamparapensar se deveriam."@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
Eu segui o script deexemplo daprimeira resposta,masnãoestava recebendo saída ouerros.
Eumudeiesta linha:
$handle = popen( __DIR__ . '/' . $data['file'], 'r' );
Paraisso:
$handle = popen( __DIR__ . '/' . $data['file'] . ' 2>&1', 'r' );
e depois recebeu umamensagem "Permissãonegada".
no console,eu corri
chmod 777 hello.py
Atualizou apáginae tudofuncionouperfeitamente.
Estapode ser a questão que Joeestava vendo acima.Eunãotenho um representante suficienteparafazer um comentário,desculpe.Espero queisso ajude alguém.
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.
-
Nãofaça apermissão 777. Apenasfaçaissoexecutável.`chmod + xfilename.py` vaifazerDo 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
Aquiestá umpequeno script que usa
proc_open
como observado acima,paraenviar uma variável detexto simplespara um 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
Adicionado algunstestes como aparteinferiorpara ver se o arquivo Python é
rwx
. Eu acho que umamaneiramelhor deenviar oargv
seria usando a FWRE,masnãoestavafuncionandoparamim seguindo estetutorial .Aquiestá o script Python que usei. Como observadoem comentários acima,algo como
#!/usr/bin/env python
pode sernecessário,dependendo do servidor.#!/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
Eutenho umainstalação do WordPresspara umblogpessoale estougradualmenteportandotodos ospequenosbits da web queescrevi ao longo dos anosem páginasnoblog.
Uma dessaspáginas é http://www.projecttoomanycooks.co. uk/cgi-bin/memória/majoranálise.py Qual é um simples script Python que retorna uma lista depalavras - Eugostaria deincorporaresse comportamento dentro de umapágina do WordPress - alguémpoderiame apontarna direção certapara Amaneiramaisfácil de correr umponto de Python dentro do WordPress?
editar - seguindo a respostamaravilhosa abaixo,eutenhomuitomais ...masinfelizmente aindanãoestá lá ...
Eutenho Python queexecutano servidor ...
e énomesmo diretório que oplugin ativado ...
O código Python ... quetem o seguinte código ...
ophp: