PHP में Python को कॉल करना


83

मेरे पास एक पायथन स्क्रिप्ट है जिसे मैंने हाल ही में लिखा था कि मैं कुछ विकल्पों के साथ कमांड लाइन का उपयोग कर रहा हूं। अब मैं अपने मैक पर स्थानीय रूप से इस स्क्रिप्ट को कॉल करने के लिए एक बहुत ही पतली वेब इंटरफ़ेस चाहता हूं।

मैं अपने मैक पर mod_python या mod_wsgi को स्थापित करने की मामूली परेशानी से नहीं गुजरना चाहता, इसलिए मैं केवल Python script को कॉल करने के लिए PHP से एक सिस्टम () या popen () करने जा रहा था।

कोई बेहतर विचार? अग्रिम में धन्यवाद!

जवाबों:


106

आप जो कर रहे हैं, उसके आधार पर सिस्टम () या पॉपेन () सही हो सकता है। सिस्टम का उपयोग करें () यदि पाइथन स्क्रिप्ट का कोई आउटपुट नहीं है, या यदि आप चाहते हैं कि पाइथन स्क्रिप्ट का आउटपुट सीधे ब्राउज़र पर जाए। यदि आप पायथन स्क्रिप्ट के मानक इनपुट के लिए डेटा लिखना चाहते हैं, या php में पायथन स्क्रिप्ट के मानक आउटपुट के डेटा को पढ़ना चाहते हैं, तो popen () का उपयोग करें। popen () आपको केवल पढ़ने या लिखने देगा, लेकिन दोनों को नहीं। यदि आप दोनों चाहते हैं, तो देखें proc_open () देखें , लेकिन प्रोग्राम के बीच दो तरह से संचार के साथ आपको गतिरोध से बचने के लिए सावधान रहने की आवश्यकता है, जहां प्रत्येक प्रोग्राम कुछ करने के लिए दूसरे की प्रतीक्षा कर रहा है।

यदि आप पायथन स्क्रिप्ट के लिए उपयोगकर्ता द्वारा दिए गए डेटा को पास करना चाहते हैं, तो कमांड इंजेक्शन के बारे में सावधान रहना बड़ी बात है। यदि आप सावधान नहीं हैं, तो आपका उपयोगकर्ता आपको डेटा भेज सकता है जैसे "? Badcommand;" और अपने कार्यक्रम को अपनी इच्छा के विरूद्ध मनमाना आदेश निष्पादित करें।

escapeshellarg () और escapeshellcmd () इस के साथ मदद कर सकते हैं, लेकिन व्यक्तिगत रूप से मैं सब कुछ को दूर करना पसंद करता हूं जो एक ज्ञात अच्छा चरित्र नहीं है, कुछ का उपयोग करके

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

1
उपप्रोसेस मॉड्यूल ने सीधे os.Popen [n] का उपयोग किया है। आपको इसके बजाय इसका उपयोग करना चाहिए।
निक स्टिनमेट्स

6
@ निक Stinemates: हम PHP कार्यों के बारे में बात कर रहे हैं;)
ग्लासगो

क्या ऐसा कोई समाधान नहीं है जिसमें शेल शामिल नहीं है, जैसे कि C का निष्पादित () इसके अलावा यह पहले फोर्क () होने के बजाय एक अलग प्रक्रिया पर चलता है।
रेयान

वहाँ है और वहाँ हमेशा समाधान किया गया है, लेकिन आप इसे से बाहर कुछ पाने के लिए कहीं अजगर को चलाना चाहिए। आप साधारण अजगर की सेवा कर सकते हैं जो बस इनपुट का इंतजार करता है जब तक कि उसके पास कुछ न हो या आप किसी भी तरह से प्रोग्राम को ट्रिगर कर सकें (उदाहरण के लिए linot inify), तो वहाँ उन PHP एक्सटेंशन और फिर linux सर्वर के लिए स्थानीय सॉकेट है। PHP में पायथन सबसे अच्छा NoShell समाधान की तरह दिखता है अन्य (नॉन-प्लगइन) हमेशा आपके अजगर के आसपास किसी प्रकार का खोल होगा।
संपो सरला - codidact.org

27

बैककॉट ऑपरेटर आपको ऊपर के समान सिंटैक्स का उपयोग करके अजगर स्क्रिप्ट चलाने की अनुमति भी देगा

एक अजगर फ़ाइल में जिसे python.py कहा जाता है:

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

Python.php नामक एक php फ़ाइल में:

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

15

एक PHP एक्सटेंशन भी है: PHP में Pip - Python , जिसे मैंने कभी नहीं आजमाया है, लेकिन इसे ऐसे किसी अवसर के लिए बुकमार्क किया था


11
सावधान रहें नाम "पाइप" का उपयोग अत्यंत लोकप्रिय और काफी मानक पायथन पैकेज प्रबंधन उपकरण का वर्णन करने के लिए भी किया जाता है, इसलिए यह इस PHP उपकरण के लिए एक बहुत बुरा, भ्रमित और बर्बाद नाम है। शायद इसलिए इसे इतने लंबे समय तक अपडेट नहीं किया गया।
ग्रेग जूल

2
ऐसा लगता है कि यह अभी भी चल रहा है (खराब नाम पसंद) github.com/jparise/php-python
benekastah

11

आप php के माध्यम से एक अजगर स्क्रिप्ट चला सकते हैं, और ब्राउज़र पर आउटपुट कर सकते हैं।

मूल रूप से आपको अजगर स्क्रिप्ट को इस तरह से कॉल करना होगा:

$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);

नोट: यदि आप किसी भी time.sleep () को आप अजगर कोड में चलाते हैं, तो यह ब्राउज़र पर परिणामों को आउटपुट नहीं करेगा।

काम करने वाले पूर्ण कोड के लिए, php से अजगर स्क्रिप्ट को कैसे निष्पादित करें और ब्राउज़र पर आउटपुट दिखाएं


यहाँ कैसे पथ निर्दिष्ट करने के लिए रिश्तेदार और निरपेक्ष। मूल रूप से मेरे पास मेरी पाइथन लिपि है जो फोल्डर के नीचे मौजूद है tempmonऔर उसी फोल्डर में मेरी पाइथन लिपि है। मैं चाहता हूं कि एप्लिकेशन पोर्टेबल हो ताकि केवल tempmonफ़ोल्डर की प्रतिलिपि बनाई जा सके htdocs। और एक ही मशीन पर काम करना चाहिए।
कृष्ण ओझा

पूरी तरह से काम किया। आप शुरुआती के लिए बेहतर समझ के लिए खुलने और बंद होने वाले php टैग <? Php?> को जोड़ सकते हैं
ज़हीर

7

मैं त्वरित और गंदी स्क्रिप्ट के लिए हर समय इस तरह की बात करता हूं। CGI या PHP स्क्रिप्ट का होना बहुत आम बात है जो कुछ बाहरी प्रोग्राम को कॉल करने के लिए सिस्टम / पोपेन का उपयोग करता है।

यदि आपका वेब सर्वर बड़े पैमाने पर इंटरनेट के लिए खुला है तो बस अतिरिक्त सावधानी बरतें। इस मामले में अपने GET / POST इनपुट को साफ करना सुनिश्चित करें ताकि हमलावरों को आपकी मशीन पर मनमाना आदेश न चलाने दें।


3

आपका call_python_file.php इस तरह दिखना चाहिए:

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

यह अजगर स्क्रिप्ट को निष्पादित करता है और परिणाम को ब्राउज़र में आउटपुट करता है। जबकि आपकी अजगर लिपि में (sys.argv [1:]) चर आपके सभी तर्कों को लाएगा। यदि आप एक पाठ क्षेत्र करना चाहते हैं, तो जहाँ से आपका php खींच रहा है, उसके लिए argv को एक स्ट्रिंग के रूप में प्रदर्शित करने के लिए:

import sys

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

def main():
  print list1

if __name__ == '__main__':
    main()

0

ध्यान दें कि यदि आप एक आभासी वातावरण (साझा होस्टिंग में) का उपयोग कर रहे हैं, तो आपको अपने मार्ग को अजगर पर समायोजित करना होगा, जैसे: /home/user/mypython/bin/python ./cgi-bin/test.py


0

उपरोक्त विधियाँ जटिल लगती हैं। संदर्भ के रूप में मेरी विधि का उपयोग करें।

मेरे पास यह दो फाइलें हैं

run.php

mkdir.py

यहाँ, मैंने एक html पेज बनाया है जिसमें GO बटन है। जब भी आप इस बटन को दबाएंगे एक नया फ़ोल्डर निर्देशिका में बनाया जाएगा जिसका पथ आपने उल्लेख किया है।

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

यदि आप PHP में अपनी पायथन स्क्रिप्ट को निष्पादित करना चाहते हैं, तो अपनी php स्क्रिप्ट में यह कमांड करना आवश्यक है:

exec('your script python.py')

a) अलग मापदंडों को स्थान देता है, अर्थात यह प्रोग्राम yourको मापदंडों scriptऔर के साथ कॉल करने की कोशिश करता है python.py। ख) जब तक पाइथन स्क्रिप्ट में एक उचित शेबंग नहीं होता है, तब तक पाइथन इंटरप्रेटर को कॉल करना होगा और स्क्रिप्ट का नाम इसे पास करना होगा ( python script.py)। यहां तक ​​कि एक उचित शेबंग के साथ यह गलत है क्योंकि आप ./script.pyदुभाषिया नाम का उपयोग करने के बजाय कॉल करेंगे ।
Tox
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.