PHP'de Python'u Çağırma


83

Yakın zamanda yazdığım bir Python betiğim var, komut satırını kullanarak bazı seçeneklerle çağırıyorum. Şimdi bu betiği Mac'imde yerel olarak çağırmak için çok ince bir web arayüzü istiyorum.

Mac'ime mod_python veya mod_wsgi kurmanın küçük sorunlarından geçmek istemiyorum, bu yüzden Python betiğini çağırmak için PHP'den bir system () veya popen () yapacaktım.

Daha iyi bir fikrin var mı? Şimdiden teşekkürler!

Yanıtlar:


106

Ne yaptığınıza bağlı olarak system () veya popen () mükemmel olabilir. Python betiğinin çıktısı yoksa veya Python betiğinin çıktısının doğrudan tarayıcıya gitmesini istiyorsanız system () kullanın. Python betiğinin standart girişine veri yazmak veya Python betiğinin standart çıktısından php'de veri okumak istiyorsanız popen () kullanın. popen () yalnızca okumanıza veya yazmanıza izin verir, ikisini birden yapamaz. Her ikisini de istiyorsanız proc_open () 'i kontrol edin , ancak programlar arasında iki yönlü iletişimde, her programın diğerinin bir şeyler yapmasını beklediği kilitlenmelerden kaçınmak için dikkatli olmanız gerekir.

Kullanıcı tarafından sağlanan verileri Python betiğine geçirmek istiyorsanız, dikkatli olmanız gereken en önemli şey komut enjeksiyonudur. Dikkatli olmazsanız, kullanıcınız size "; evilcommand;" gibi veriler gönderebilir. ve programınızın isteğiniz dışında rastgele komutlar yürütmesini sağlayın.

escapeshellarg () ve escapeshellcmd () bu konuda yardımcı olabilir, ancak şahsen, iyi bir karakter olmadığı bilinen her şeyi kaldırmayı seviyorum.

preg_replace('/[^a-zA-Z0-9]/', '', $str)

1
Alt işlem modülü doğrudan os.Popen [n] kullanılarak değiştirildi. Onun yerine bunu kullanmalısın.
Nick Stinemates

6
@Nick Stinemates: PHP işlevlerinden bahsediyoruz;)
Glaslos

C'nin execve () gibi bir kabuğu İÇERMEYEN bir çözüm yok mu, önce fork () yapmak zorunda kalmak yerine ayrı bir işlem üzerinde çalışıyor.
Lie Ryan

Çözümler var ve her zaman var ama ondan bir şey elde etmek için bir yerde python çalıştırmalısınız. Basit bir python hizmeti yapıp, bir miktar girene kadar girdi bekleyebilir ya da bir şekilde programınızı tetikleyebilirsiniz (örneğin linux inotify), sonra bu PHP uzantıları var ve sonra linux sunucuları için yerel soketler var. PHP'deki Python, en iyi NoShell çözümüne benziyor, çünkü diğer (eklenti olmayan) python'unuzun etrafında her zaman bir tür kabuk olacaktır.
Sampo Sarrala - codidact.org

27

Geri alıntı operatörü ayrıca, yukarıdakine benzer sözdizimi kullanarak python komut dosyalarını çalıştırmanıza izin verir

Python.py adlı bir python dosyasında:

hello = "hello"
world = "world"
print hello + " " + world

Python.php adlı bir php dosyasında:

$python = `python python.py`;
echo $python;

15

Ayrıca bir PHP uzantısı var: Pip - PHP'de Python , bunu hiç denemedim, ancak böyle bir durum için yer imlerine ekledi


11
Dikkat edin, "pip" adının son derece popüler ve oldukça standart Python paket yönetim aracını tanımlamak için de kullanıldığı, bu yüzden bu PHP aracı için gerçekten kötü, kafa karıştırıcı ve mahkum bir isim. Belki de bu yüzden bu kadar uzun süredir güncellenmedi.
GregD

2
Hâlâ devam ediyor gibi görünüyor (kötü isim seçimi değil) github.com/jparise/php-python
benekastah

11

Bir python betiğini php aracılığıyla çalıştırabilir ve tarayıcıda çıktı alabilirsiniz.

Temelde python betiğini şu şekilde çağırmanız gerekir:

$command = "python /path/to/python_script.py 2>&1";
$pid = popen( $command,"r");
while( !feof( $pid ) )
{
 echo fread($pid, 256);
 flush();
 ob_flush();
 usleep(100000);
}
pclose($pid);

Not: python kodunuzda herhangi bir time.sleep () çalıştırırsanız, sonuçları tarayıcıya vermez.

Kodların tam olarak çalışması için, php'den python betiği nasıl çalıştırılır ve tarayıcıda çıktı gösterme sayfasını ziyaret edin


Yol burada göreceli ve mutlak nasıl belirlenir. Temelde python betiğim klasörün altında mevcut tempmonve aynı klasör benim python betiğimi içeriyor. Uygulamanın taşınabilir olmasını istiyorum, böylece tempmonklasörü altına kopyalayabilirim htdocs. Ve aynı şey farklı makinelerde çalışmalıdır.
Krishna Oza

Mükemmel çalıştı. Yeni başlayanlar için daha iyi anlamak için açılış ve kapanış php etiketlerini <? Php?> Ekleyebilirsiniz
Zaheer

7

Hızlı ve kirli senaryolar için her zaman bu tür şeyler yapıyorum. Bazı harici programları çağırmak için sadece system / popen kullanan bir CGI veya PHP betiğine sahip olmak oldukça yaygındır.

Web sunucunuz internete açıksa çok dikkatli olun. Saldırganların makinenizde rastgele komutlar çalıştırmasına izin vermemek için GET / POST girişinizi bu durumda temizlediğinizden emin olun.


3

Call_python_file.php dosyanız şöyle görünmelidir:

<?php
    $item='Everything is awesome!!';
    $tmp = exec("py.py $item");
    echo $tmp;
?>

Bu, python betiğini çalıştırır ve sonucu tarayıcıya çıkarır. Python betiğinizdeyken, (sys.argv [1:]) değişkeni tüm argümanlarınızı getirecektir. Eğer bir metin alanı yapmak istiyorsanız, argv'yi php'nizin aldığı yer için bir dizge olarak görüntülemek için:

import sys

list1 = ' '.join(sys.argv[1:])

def main():
  print list1

if __name__ == '__main__':
    main()

0

Bir sanal ortam kullanıyorsanız (paylaşılan barındırmada olduğu gibi), python'a giden yolu ayarlamanız gerekir, örneğin: /home/user/mypython/bin/python ./cgi-bin/test.py


0

Yukarıdaki yöntemler karmaşık görünmektedir. Metodumu referans olarak kullan.

Bu iki dosyam var

run.php

mkdir.py

Burada GO butonunu içeren bir html sayfası oluşturdum. Bu düğmeye her bastığınızda, yolundan bahsetmiş olduğunuz dizinde yeni bir klasör oluşturulur.

run.php

<html>
 <body>
  <head>
   <title>
     run
   </title>
  </head>

   <form method="post">

    <input type="submit" value="GO" name="GO">
   </form>
 </body>
</html>

<?php
    if(isset($_POST['GO']))
    {
        shell_exec("python /var/www/html/lab/mkdir.py");
        echo"success";
    }
?>

mkdir.py

#!/usr/bin/env python    
import os    
os.makedirs("thisfolder");

-2

Python betiğinizi PHP'de çalıştırmak istiyorsanız, bu komutu php betiğinizde yapmanız gerekir:

exec('your script python.py')

a) Spaces programı çağırmak için bu çalışır, ie parametreyi ayırmak yourparametrelerle scriptve python.py. b) Python betiğinin düzgün bir betiği yoksa, Python yorumlayıcısını çağırmalı ve betiğin adını ona iletmelidir ( python script.py). Düzgün bir shebang olsa bile ./script.py, tercüman adını kullanmak yerine arayacağınız için bu yanlıştır .
Tox
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.