इस तरह से गोले / दुभाषियों के लिए इनपुट भेजना बहुत समस्याग्रस्त है और किसी भी विश्वसनीय तरीके से काम करना बहुत मुश्किल है।
उचित तरीका सॉकेट्स का उपयोग करना है, यही कारण है कि उनका आविष्कार किया गया था, आप कमांड लाइन का उपयोग करके ncat ncया socatएक साधारण सॉकेट में अजगर प्रक्रिया को बांधने के लिए कर सकते हैं । या एक साधारण अजगर आवेदन लिखें जो पोर्ट को बांधता है और एक सॉकेट पर व्याख्या करने के लिए आदेशों के लिए सुनता है।
सॉकेट स्थानीय हो सकते हैं और किसी भी वेब इंटरफ़ेस के संपर्क में नहीं आ सकते।
समस्या यह है कि यदि आप pythonकमांड लाइन से शुरू करते हैं, तो यह आमतौर पर आपके शेल से जुड़ा होता है जो टर्मिनल से जुड़ा होता है, वास्तव में हम देख सकते हैं
$ ls -al /proc/PID/fd
lrwxrwxrwx 1 USER GROUP 0 Aug 1 00:00 0 -> /dev/pty1
इसलिए जब आप stdinअजगर के बारे में लिखते हैं, तो आप वास्तव में ptyएक साधारण फ़ाइल नहीं, बल्कि psuedo- टर्मिनल, जो एक कर्नेल डिवाइस है, लिख रहे हैं । यह उपयोग ioctlनहीं करता है readऔर writeइसलिए, आपको अपनी स्क्रीन पर आउटपुट दिखाई देगा, लेकिन यह स्पैन्ड प्रक्रिया को नहीं भेजा जाएगा ( python)
आप जो कोशिश कर रहे हैं उसे दोहराने का एक तरीका है fifoया named pipe।
# make pipe
$ mkfifo python_i.pipe
# start python interactive with pipe input
# Will print to pty output unless redirected
$ python -i < python_i.pipe &
# keep pipe open
$ sleep infinity > python_i.pipe &
# interact with the interpreter
$ echo "print \"hello\"" >> python_i.pipe
आप screenकेवल इनपुट के लिए भी उपयोग कर सकते हैं
# start screen
$ screen -dmS python python
# send command to input
$ screen -S python -X 'print \"hello\"'
# view output
$ screen -S python -x