2017-06-17 12 views
6

नोटबुक से सीधे आदेश पंक्ति स्टेटमेंट्स को निष्पादित करने IPython Jupyter नोटबुक में एक दिलचस्प विकल्प नहीं है। उदाहरण के लिए:चल रहा कमांड लाइन कोड

! mkdir ... 
! python file.py 

इसके अलावा - इस कोड का उपयोग कर os चलाया जा सकता है:

import os 
os.system('cmd command') 

लेकिन कैसे करना है मैं इंटरैक्टिव खोल आदेशों को चलाने के। उदाहरण के लिए:

!conda install package 

भविष्य इनपुट ([Y]/N) या फ़ोल्डर स्थान की आवश्यकता हो सकती है, लेकिन आगे इनपुट स्वीकार नहीं करेंगे।

+0

त्वरित प्रश्न: आप कौन से ओएस हैं बारे में पूछना? इस सवाल के लिए, मुझे लगता है कि यह मायने रखता है। स्पष्ट रूप से आप यदि चाहें तो बैश खोल दर्ज कर सकते हैं, लेकिन यदि आप विंडोज पर हैं तो इससे कोई फर्क नहीं पड़ता है। –

+0

मुझे लगता है कि यह उनमें से 3 के लिए प्रासंगिक है, लेकिन मैं विशेष रूप से मैक ओएस सिस्टम में रूचि रखता हूं। – Dimgold

+0

मैक शायद एक बैश खोल हो सकता है। मैं कल इसे देख लूंगा। –

उत्तर

0

मैं एक जवाब के रूप में इस पोस्टिंग कर रहा हूँ। यह एक अच्छा जवाब नहीं है, लेकिन जिस तरह से मैं समस्या को संभालने का तरीका पृष्ठभूमि में चलाने के लिए एक बैश स्क्रिप्ट लिखना है। मैंने '!' में देखा है ऑपरेटर और इसमें बहुत सारे प्रलेखन प्रतीत नहीं होते हैं। मैं इसे जुपीटर स्रोत में भी नहीं ढूंढ सकता। यह लेख:

[Jupyter पूर्ववर्ती और घटक IPython के बारे में सफारी पुस्तक] [1] https://www.safaribooksonline.com/blog/2014/02/12/using-shell-commands-effectively-ipython/

पता चलता है कि यह बस जिस तरह से चीजें से पहले थे और शायद हमेशा के लिए किया जाएगा है। जब तक आप जुपीटर नोटबुक के जादू कमांड भाग में हैक करना नहीं चाहते हैं और इसे स्वयं ठीक कर सकते हैं।

जिसके अनुसार, यह देखते हुए कि एक छोटे से बैश प्रोग्रामिंग (यह आसान है और ध्यान केंद्रित) आप आप क्या करने की कोशिश कर रहे हैं क्या कर सकते हैं के साथ, आप उस मार्ग सोच सकते हैं। विशेष रूप से यदि आपको उस पर प्रतिष्ठा रखने के लिए पर्याप्त परिणामों की आवश्यकता है। गैर-सहभागी आर्ग उपयोग कर रहा है आज्ञाओं मैं का सामना किया है के अधिकांश के लिए Have bash script answer interactive prompts

0

अच्छा विकल्प:

यदि आपका कोई अपेक्षित प्रतिक्रिया इस उत्तर के खिलाफ के साथ बैश स्क्रिप्ट चला पर गौर करना चाहते हैं यदि आप के लिए देख रहे है । जैसे

conda install package -y 

आप पूरी तरह संकेतों को खिलाने के लिए की जरूरत है, आप printf हैक, जैसे उपयोग कर सकते हैं: उपरोक्त मामले में

printf 'y\n' | conda install package 

इस का समर्थन करता है एकाधिक आदानों हैं, तो उन्हें '\ n'

अलग
1

!command सिंटैक्स %system जादू का एक वैकल्पिक वाक्यविन्यास है, जो दस्तावेज here पाया जा सकता है।

जैसा कि आपने अनुमान लगाया है, यह os.system का आह्वान कर रहा है और जहां तक ​​os.system काम करता है, यह जानने का कोई आसान तरीका नहीं है कि आप जिस प्रक्रिया को चलाएंगे, उसे उपयोगकर्ता से इनपुट की आवश्यकता होगी या नहीं। इस प्रकार नोटबुक या किसी भी बहु-प्रक्रिया फ्रंटेंड का उपयोग करते समय आपके पास चल रहे प्रोग्राम को गतिशील रूप से इनपुट प्रदान करने का कोई तरीका नहीं है। (पायथन में input पर कॉल के विपरीत हम अवरोध कर सकते हैं)।

जैसा कि आप स्पष्ट रूप से नोटबुक से पैकेज स्थापित करने में रुचि दिखाते हैं, मैं सुझाव देता हूं कि the following from Jake Van Der Plas पढ़ना जो विषय पर हालिया चर्चा का सारांश है, और ऐसा करने की कुछ जटिलताओं को समझाएं। आप निश्चित रूप से कोंडा के --yes विकल्प के साथ जा सकते हैं, लेकिन यह हमेशा कोंडा के साथ स्थापित करने की गारंटी नहीं देता है।

ध्यान दें कि !command एक आईपीथॉन सुविधा है, जो जुपीटर नहीं है।

1

मान लीजिए कि आप अंतःक्रियाशीलता के बारे में पूछ रहे हैं, ऐसा कुछ है जिसे आप आजमा सकते हैं।

तो क्या आपने कभी सोचा है कि कैसे 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 का उपयोग करें)

संबंधित मुद्दे