इस तरह से गोले / दुभाषियों के लिए इनपुट भेजना बहुत समस्याग्रस्त है और किसी भी विश्वसनीय तरीके से काम करना बहुत मुश्किल है।
उचित तरीका सॉकेट्स का उपयोग करना है, यही कारण है कि उनका आविष्कार किया गया था, आप कमांड लाइन का उपयोग करके 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