2008-10-03 13 views
72

Yakın bir zamanda, bazı seçenekler içeren komut satırını kullanarak aradığım bir Python betiğim var. Şimdi bu betiği Mac'imde yerel olarak aramak için çok ince bir web arayüzü istiyorum.Python'u PHP'de Çağırma

Mac'imde mod_python veya mod_wsgi'yi yükleme konusunda küçük bir sorun yaşamak istemiyorum, bu yüzden Python komut dosyasını çağırmak için PHP'den bir sistem() veya popen() yapıyorum.

Daha iyi bir fikir? Şimdiden teşekkürler!

cevap

96

Ne yaptığınıza bağlı olarak, system() veya popen() mükemmel olabilir. Python betiğinin çıktısı yoksa veya Python komut dosyasının çıktısının doğrudan tarayıcıya gitmesini istiyorsanız, sistemi() kullanın. Python komut dosyasının standart girdisine veri yazmak istiyorsanız veya Python komut dosyasının standart çıktısını php olarak okuyarak popen() kullanın. popen() sadece okumanıza veya yazmanıza izin verir, ancak ikisini de değil. Her ikisini de isterseniz, proc_open()'u kontrol edin, ancak programlar arasında iki yönlü iletişim ile, her programın diğerinin bir şey yapmasını beklediği, kilitlenmeleri önlemek için dikkatli olmanız gerekir.

Kullanıcı tarafından sağlanan verileri Python komut dosyasına iletmek isterseniz, dikkat etmeniz gereken en önemli şey komut enjeksiyonudur. Dikkatli değilseniz, kullanıcınız size "; evilcommand;" gibi verileri gönderebilir. ve programınızın iradesine karşı keyfi komutlar yürütmesini sağlayın.

escapeshellarg() ve escapeshellcmd() bu konuda yardım edebilir, ama şahsen ben çabuk-için bu tür şeyleri hep yapıyor

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

Çok teşekkür ederim! Bu çok kapsamlıydı –

+1

Alt işlem modülü, doğrudan os.Popen [n] kullanılarak değiştirildi. Bunun yerine kullanmalısın. –

+5

@Nick Stinemates: PHP fonksiyonlarından bahsediyoruz;) – Glaslos

7

gibi bir şey kullanarak, bilinen iyi bir karakter değil her şeyi kaldırmak ister ve kirli komut dosyaları. Sadece bir dış program çağırmak için sistem/popen kullanan bir CGI veya PHP betiğine sahip olmak oldukça yaygındır.

Web sunucunuzun internete açık olması durumunda daha dikkatli olun. Bu durumda, saldırganların makinenizde rastgele komutlar çalıştırmasına izin vermemek için GET/POST girişinizi dezenfekte ettiğinizden emin olun.

15

Orada da bir PHP uzantısı: Pip - Python in PHP, denedim ama

+7

"pip" ismi de oldukça popüler ve oldukça standart Python paket yönetim aracını tanımlamak için kullanıldığında uyarılmalıdır, bu yüzden bu PHP aracı için gerçekten kötü, kafa karıştırıcı ve mahkum edilmiş bir addır. Belki de bu yüzden uzun zamandır güncellenmemiştir. – GregD

+2

Halen devam ediyor gibi görünüyor (fakir isim seçimi) https://github.com/jparise/php-python – benekastah

11

Sen php üzerinden bir python komut dosyası çalıştırabilirsiniz böyle bir durum için yer işareti olmadı ve tarayıcıda çıkışları.

$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:

Temelde Python komut bu şekilde aramak zorunda Eğer size piton kodunda herhangi time.sleep() çalıştırırsanız, bu tarayıcıda, sonuçları olmaz. çalışan tam kodları için

, bir piton dosyasında

python.py denilen yukarıda backquote operatörü ayrıca benzer bir sözdizimi kullanarak piton komut dosyalarını çalıştırmak için izin verecektir How to execute python script from php and show output on browser

+0

Burada yol nasıl göreli ve mutlak belirtilir. Temelde python betiğimde mevcut olan 'tempmon' klasörünü ve aynı klasör benim python betiğimi içerir. Uygulamanın taşınabilir olmasını istiyorum, bu yüzden 'htdocs' altındaki' tempmon' klasörünü kopyalayabilirim. Aynı şey farklı makinelerde çalışmalıdır. –

+0

Mükemmel bir şekilde çalıştı. Acemi – zHs

24

ziyaret edin:

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

Python adlı bir php dosyasında.php: php komut bu komutu yapmak

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

yeni başlayanlar için daha iyi anlamak için açılış ve kapanış php etiketleri ekleyebilirsiniz ve işler! – atmelino

-1

PHP içinde Python komut dosyasını çalıştırmak istiyorsanız, buna mecburuz:

exec('your script python.py') 
2

böyle görünmelidir call_python_file.php:

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

Bu, python komut dosyasını yürütür ve sonucu tarayıcıya gönderir. Python betiğinizde (sys.argv [1:]) değişkeni tüm argümanlarınızı getirecektir. php bir metin alanı yapmak istiyorum eğer öyleyse çekerek her yerde bir dize olarak argv görüntülemek için: sanal bir ortam kullanıyorsanız (barındırma paylaşılan olduğu gibi) bu

import sys 

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

def main(): 
    print list1 

if __name__ == '__main__': 
    main() 
0

Not sonra ayarlamak gerekir python yolunuz, örneğin: /home/user/mypython/bin/python ./cgi-bin/test.py