मुझे लगता है कि मुझे पाइथन में pty.fork
के लिए अंततः न्यूनतम उदाहरण मिला - और चूंकि मुझे एक समान उदाहरण खोजने में बेहद मुश्किल लगता है, इसलिए मैं इसे @ जॉनी के उत्तर के उदाहरण के रूप में यहां पोस्ट कर रहा हूं। यह अनिवार्य रूप पर आधारित है:
("
master_open() और slave_open 2.0 के बाद अमान्य हो जाने के")
विशेष रूप से गंदे बिट्स दस्तावेज ढूंढ रहे हैं जो अभी भी master_open()
को संदर्भित करता है जो अप्रचलित है; और तथ्य यह है कि pty.fork
एक बच्चे की प्रक्रिया, स्पॉन नहीं होने तक फ़ाइल डिस्क्रिप्टर (फोर्क विधि द्वारा लौटाया गया) माता-पिता प्रक्रिया से पढ़ा जाता है! (ध्यान दें कि os.fork
में ऐसी कोई आवश्यकता नहीं है) इसके अलावा, ऐसा लगता है कि os.fork
थोड़ा और पोर्टेबल है (कुछ टिप्पणियां पढ़ें जो pty.fork
कुछ प्लेटफ़ॉर्म पर काम नहीं करती हैं)।
#!/usr/bin/env python
# pyecho.py
import sys;
print "pyecho starting..."
while True:
print sys.stdin.readline().upper()
... और फिर, यहाँ है:
फिर भी, यहाँ पहली बार एक स्क्रिप्ट (pyecho.py
) कि (यह केवल मानक इनपुट से लाइनों पढ़ता है, और उन्हें वापस लिखते हैं अपरकेस में) एक निष्पादन रूप में कार्य करता है वास्तविक स्क्रिप्ट (यह आवश्यक होगा कि pyecho.py एक ही निर्देशिका में है):
#!/usr/bin/env python
import sys
import os
import time
import pty
def my_pty_fork():
# fork this script
try:
(child_pid, fd) = pty.fork() # OK
#~ child_pid, fd = os.forkpty() # OK
except OSError as e:
print str(e)
#~ print "%d - %d" % (fd, child_pid)
# NOTE - unlike OS fork; in pty fork we MUST use the fd variable
# somewhere (i.e. in parent process; it does not exist for child)
# ... actually, we must READ from fd in parent process...
# if we don't - child process will never be spawned!
if child_pid == 0:
print "In Child Process: PID# %s" % os.getpid()
# note: fd for child is invalid (-1) for pty fork!
#~ print "%d - %d" % (fd, child_pid)
# the os.exec replaces the child process
sys.stdout.flush()
try:
#Note: "the first of these arguments is passed to the new program as its own name"
# so:: "python": actual executable; "ThePythonProgram": name of executable in process list (`ps axf`); "pyecho.py": first argument to executable..
os.execlp("python","ThePythonProgram","pyecho.py")
except:
print "Cannot spawn execlp..."
else:
print "In Parent Process: PID# %s" % os.getpid()
# MUST read from fd; else no spawn of child!
print os.read(fd, 100) # in fact, this line prints out the "In Child Process..." sentence above!
os.write(fd,"message one\n")
print os.read(fd, 100) # message one
time.sleep(2)
os.write(fd,"message two\n")
print os.read(fd, 10000) # pyecho starting...\n MESSAGE ONE
time.sleep(2)
print os.read(fd, 10000) # message two \n MESSAGE TWO
# uncomment to lock (can exit with Ctrl-C)
#~ while True:
#~ print os.read(fd, 10000)
if __name__ == "__main__":
my_pty_fork()
ठीक है, उम्मीद है कि इस मदद करता है किसी को,
चीयर्स!
यह कोड मेरे लिए काम नहीं करता है। यहां आउटपुट है: http://pastebin.com/MjGUChTy –