2015-11-03 12 views
21

में सेल सामग्री पढ़ें मेरे पास मिश्रित markdown और python कोशिकाओं के साथ ipython नोटबुक है।आईपीथॉन नोटबुक

और मुझे अपने python कोशिकाओं को आसन्न markdown कोशिकाओं को पढ़ने और उन्हें इनपुट के रूप में संसाधित करने के लिए कुछ चाहिए।

वांछित स्थिति का एक उदाहरण:

सेल 1 (markdown): एसक्यूएल कोड को निष्पादित करने के

सेल 2 (markdown): select * from tbl where x=1

सेल 3 (पायथन): mysql.query(ipython.previous_cell.content)

(सिंटेक्स ipython.previous_cell.content बना है)

निष्पादित "सेल 3" mysql.query("select * from tbl where x=1")

यह कैसे किया जा सकता है के बराबर होना चाहिए?

+1

मैं पूछ सकता हूं कि 'क्या यह किया जा सकता है?'। मुझे नहीं लगता कि यह स्पष्ट है। – cel

+0

यह एक तरफ या किसी अन्य तरीके से संभव है, हम हमेशा '.ipynb' प्रारूप को आजमा सकते हैं और व्याख्या कर सकते हैं, और सेल सामग्री –

+1

पढ़ सकते हैं, मैं पूछ सकता हूं कि आप इसके साथ क्या हासिल करने की कोशिश कर रहे हैं? –

उत्तर

13

मुझे लगता है कि आप गलत तरीके से समस्या पर हमला करने की कोशिश कर रहे हैं।

सबसे पहले, वास्तव में हैकिश तरीके से आसन्न मार्कडाउन सेल प्राप्त करना संभव है जो हेडलेस नोटबुक निष्पादन में काम नहीं करेगा।

आप जो करना चाहते हैं वह आईपीथॉन सेल मैजिक का उपयोग करना है, जो तब तक मनमाने ढंग से वाक्यविन्यास की अनुमति देता है जब तक सेल 2 प्रतिशत संकेतों के साथ शुरू होता है, जिसके बाद पहचानकर्ता होता है।

आमतौर पर आप SQL कक्ष चाहते हैं।

आप दस्तावेज़ देखें सकते हैं के बारे cells magics या मैं तुम्हें दिखाता कैसे निर्माण करने के लिए है कि कर सकते हैं:

from IPython.core.magic import (
    Magics, magics_class, cell_magic, line_magic 
) 

@magics_class 
class StoreSQL(Magics): 


    def __init__(self, shell=None, **kwargs): 
     super().__init__(shell=shell, **kwargs) 
     self._store = [] 
     # inject our store in user availlable namespace under __mystore 
     # name 
     shell.user_ns['__mystore'] = self._store 

    @cell_magic 
    def sql(self, line, cell): 
     """store the cell in the store""" 
     self._store.append(cell) 

    @line_magic 
    def showsql(self, line): 
     """show all recorded statements""" 
     print(self._store) 

    ## use ipython load_ext mechanisme here if distributed 
    get_ipython().register_magics(StoreSQL) 

अब आप अपने अजगर कोशिकाओं में SQL सिंटैक्स का उपयोग कर सकते हैं:

%%sql 
select * from foo Where QUX Bar 

एक दूसरे सेल:

%%sql 
Insert Cheezburger into Can_I_HAZ 

जांचें कि हमने क्या निष्पादित किया है (3 दाशे रों इनपुट/आउटपुट परिसीमन दिखाने के लिए, आप उन्हें टाइप करने के लिए) की जरूरत नहीं है:

%showsql 
--- 
['select * from foo Where QUX Bar', 'Insert Cheezburger into Can_I_HAZ'] 

और आप अपने सवाल में शुरुआत में क्या पूछा:

mysql.query(__mystore[-1]) 

निश्चित रूप से यह आवश्यकता है कि आप निष्पादित सही क्रम में पिछली कोशिकाएं, आपको सिंटैक्स का उपयोग करने से रोकने के लिए कुछ भी नहीं रोकता है, उदाहरण के लिए _storedict है, या __getattr__ को ओवरराइट करने के लिए __getattr__ को ओवरराइट करें, __getitem__ जैसे डॉट सिंटैक्स वाले फ़ील्ड तक पहुंचने के लिए।यह पाठक के लिए एक व्यायाम, या प्रतिक्रिया के अंत देखने के रूप में छोड़ दिया जाता है:

@cell_magic 
def sql(self, line, cell): 
    """store the cell in the store""" 
    self._store[line.strip()] = cell 

आप तो जैसे

%%sql A1 
set foo TO Bar where ID=9 

और फिर अपने अजगर कोशिकाओं में एसक्यूएल सेल का उपयोग कर सकते

mysql.execute(__mystore.A1) 

मैं दृढ़ता से सुझाव देता हूं कि IPython के लिए कैथरीन डेवेलिन एसक्लमैजिक को देखें, और यह Notebook gist गिटहब पर दिखाएगा जो यह सब कुछ लाइव दिखाता है।

टिप्पणी में आपको लगता है कि आप pig जोड़ना चाहते हैं, तो आपको %%pig जादू न होने से रोकें। SQL और PIG के सही सिंटेक्स हाइलाइटिंग को सक्षम करने के लिए जावास्क्रिप्ट को इंजेक्ट करना भी संभव है, लेकिन यह इस प्रश्न के दायरे से बाहर है।

+0

मुझे इस विशेष समाधान की कोई आवश्यकता नहीं है, लेकिन यह आईपीथॉन मैजिक के बारे में बहुत अच्छी जानकारी है, धन्यवाद! – alexis

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