मान लीजिए कि आप अंतःक्रियाशीलता के बारे में पूछ रहे हैं, ऐसा कुछ है जिसे आप आजमा सकते हैं।
तो क्या आपने कभी सोचा है कि कैसे Jupyter जानता है जब एक सेल के उत्पादन में समाप्त होता है:
import threading,time
a=5
threading.Thread(target=lambda:[print(a),time.sleep(20),print(a)]).start()
(जानबूझ कर कम: ठीक है, यह जाहिरा तौर पर पता नहीं है, यह सिर्फ सबसे हाल ही में सक्रिय कक्ष में किसी भी कब्जा कर लिया उत्पादन उदासीनता - अच्छा-अच्छा उदाहरण, क्योंकि यह सिर्फ साइड-जानकारी है। जबकि 20-सेकंड का इंतजार चल रहा है, आपके पास a=6
जारी करने के माध्यम से शायद एक और सेल सक्रिय करने का समय है)
इसका उपयोग कुछ लोगों के आउटपुट के लिए किया जा सकता है मुख्य थ्रेड से इसे नियंत्रित करते समय स्क्रीन पर कंसोल कोड:
import sys,threading,subprocess
proc=subprocess.Popen('/bin/sh',stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.STDOUT)
pout=proc.stdout
pin=proc.stdin
def outLoop():
running=True
while(running):
line=pout.readline().decode(sys.stdout.encoding)
print(line,end='')
running='\n' in line
print('Finished')
threading.Thread(target=outLoop).start()
तो फिर तुम आदेशों isssue कर सकते हैं,
pin.write(b'ls -l\n')
pin.flush()
और
pin.write(b'exit\n')
pin.flush()
भी b'ls\nexit\n'
काम करता है की तरह है, यही वजह है कि outLoop
इतने लंबे समय (एक सरल while(proc.poll() is None)
है - print(...)
पाश की तुलना में जल्दी खत्म होगा यह सभी आउटपुट पकड़ लिया है।
while(proc.poll() is None):
inp=bytearray(input('something: ')+'\n',sys.stdin.encoding)
if(proc.poll() is None):
pin.write(inp)
pin.flush()
यह https://try.jupyter.org/ पर अच्छी तरह से काम करता है, लेकिन स्पष्ट रूप से मैं वहाँ conda संकुल स्थापित करने की कोशिश नहीं करना चाहता था, इसलिए मैं नहीं जानता कि क्या होता है जब conda एक पूछता है: के रूप में
तो पूरी बात स्वचालित किया जा सकता है सवाल।
एक भाग्यशाली बात यह है कि इनपुट फ़ील्ड सेल के निचले हिस्से में रहता है (ls;sleep 10;ls
के साथ परीक्षण किया जाता है)। एक दुर्भाग्यपूर्ण बात यह है कि इनपुट क्षेत्र को गायब होने के अंत में एक अतिरिक्त प्रविष्टि की आवश्यकता होती है (और यह पहले से ही 'अच्छा' तरीका है, जब यह एक साधारण while(...)
- write(bytearray(input()))
- flush()
3-लाइनर था, यह अपवाद के साथ बाहर निकल रहा था।
कोई विंडोज पर यह कोशिश करना चाहता है, यह 'cmd'
के साथ काम करता है, लेकिन मैं एक हार्डकोडेड 'windows-1252'
sys.stdin/out.encoding
के बजाय उपयोग करने का सुझाव: वे UTF-8 कहते हैं, लेकिन एक साधारण dir
आदेश पहले से ही उत्पादन जो न तो UTF-8 है और न ही ASCII है पैदा करता है (आकार में 3-अंकों वाले समूहों के बीच गैर-ब्रेक करने योग्य स्थान 0xA0 वर्ण है) या बस decode
भाग (और running=0xA in line
का उपयोग करें)
त्वरित प्रश्न: आप कौन से ओएस हैं बारे में पूछना? इस सवाल के लिए, मुझे लगता है कि यह मायने रखता है। स्पष्ट रूप से आप यदि चाहें तो बैश खोल दर्ज कर सकते हैं, लेकिन यदि आप विंडोज पर हैं तो इससे कोई फर्क नहीं पड़ता है। –
मुझे लगता है कि यह उनमें से 3 के लिए प्रासंगिक है, लेकिन मैं विशेष रूप से मैक ओएस सिस्टम में रूचि रखता हूं। – Dimgold
मैक शायद एक बैश खोल हो सकता है। मैं कल इसे देख लूंगा। –