2016-03-20 3 views
5

मैं संशोधित करना चाहता हूं कि आईपीथन डिफ़ॉल्ट रूप से आयात त्रुटियों को कैसे प्रबंधित करता है। जब मैं आईपीथन शेल में कुछ प्रोटोटाइप करता हूं, तो मैं आमतौर पर os, re या जो भी मुझे चाहिए, आयात करना भूल जाता है।आईपीथॉन आयात करें मुझे क्या मतलब है

In [1]: os.path.exists("~/myfile.txt") 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-1-0ffb6014a804> in <module>() 
----> 1 os.path.exists("~/myfile.txt") 

NameError: name 'os' is not defined 

In [2]: import os 

In [3]: os.path.exists("~/myfile.txt") 
Out[3]: False 

ज़रूर, कि मेरी गलती बुरी आदतों और, यकीन रखने के लिए, एक स्क्रिप्ट या वास्तविक प्रोग्राम है जो भावना है, बनाता में लेकिन खोल मैं नहीं बल्कि कि था में है: पहले कुछ बयान अक्सर इस पैटर्न का पालन IPython डीडब्ल्यूआईएम सिद्धांत का पालन करें, कम से कम को मैं आयात करने का प्रयास करने के लिए आयात करने की कोशिश कर रहा हूं।

In [1]: os.path.exists("~/myfile.txt") 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-1-0ffb6014a804> in <module>() 
----> 1 os.path.exists("~/myfile.txt") 

NameError: name 'os' is not defined 

Catching this for you and trying to import "os" … success! 
Retrying … 
--------------------------------------------------------------------------- 
Out[1]: False 

यदि यह एक वेनिला IPython साथ संभव नहीं है, क्या मैं करने के लिए यह काम करने के लिए होता है? wrapper kernel आगे का सबसे आसान तरीका है? या इसे एक जादू कमांड के साथ सीधे कोर में लागू किया जाना चाहिए?

नोट, यह those kind of question से अलग है जहां कोई भी हमेशा पूर्व परिभाषित मॉड्यूल लोड करना चाहता है। मैं नही। Cuz मैं मैं क्या पर काम करेंगे पता नहीं है, और मैं सब कुछ लोड करने के लिए नहीं करना चाहते हैं (और न ही मैं सब कुछ अद्यतन की सूची रखना चाहते हैं

उत्तर

10

नोट:। यह अब है बनाए रखा जा रहा on Github। वहाँ से स्क्रिप्ट के नवीनतम संस्करण को डाउनलोड करें!

मैं एक स्क्रिप्ट है कि IPython के अपवाद set_custom_exc के माध्यम से निपटने के लिए बांधता है विकसित की है। अगर वहाँ एक NameError है, यह एक regex का उपयोग करता है क्या मॉड्यूल आप का उपयोग करने की कोशिश की और फिर लगता है इसे आयात करने का प्रयास करें। फिर वह फ़ंक्शन चलाता है जिसे आपने दोबारा कॉल करने का प्रयास किया था। यहां कोड है:

import sys, IPython, colorama # <-- colorama must be "pip install"-ed 

colorama.init() 

def custom_exc(shell, etype, evalue, tb, tb_offset=None): 
    pre = colorama.Fore.CYAN + colorama.Style.BRIGHT + "AutoImport: " + colorama.Style.NORMAL + colorama.Fore.WHITE 
    if etype == NameError: 
     shell.showtraceback((etype, evalue, tb), tb_offset) # Show the normal traceback 
     import re 
     try: 
      # Get the name of the module you tried to import 
      results = re.match("name '(.*)' is not defined", str(evalue)) 
      name = results.group(1) 

      try: 
       __import__(name) 
      except: 
       print(pre + "{} isn't a module".format(name)) 
       return 

      # Import the module 
      IPython.get_ipython().run_code("import {}".format(name)) 
      print(pre + "Imported referenced module \"{}\", will retry".format(name)) 
     except Exception as e: 
      print(pre + "Attempted to import \"{}\" but an exception occured".format(name)) 

     try: 
      # Run the failed line again 
      res = IPython.get_ipython().run_cell(list(get_ipython().history_manager.get_range())[-1][-1]) 
     except Exception as e: 
      print(pre + "Another exception occured while retrying") 
      shell.showtraceback((type(e), e, None), None) 
    else: 
     shell.showtraceback((etype, evalue, tb), tb_offset=tb_offset) 

# Bind the function we created to IPython's exception handler 
IPython.get_ipython().set_custom_exc((Exception,), custom_exc) 

जब आप इसे कहीं बचत और फिर एक वातावरण चर इस फ़ाइल का पथ को PYTHONSTARTUP कहा जाता है की स्थापना करके एक IPython शीघ्र शुरू आप स्वचालित रूप से इस रन बना सकते हैं। आप वातावरण चर को अलग ढंग से सेट अपने ओएस पर निर्भर करता है (पथ को बदलने के लिए याद):

  • विंडोज: कमांड प्रॉम्प्ट में setx PYTHONSTARTUP C:\startup.py
  • मैक/लिनक्स (बैश): अपने ~/.bashrc

में रखो export PYTHONSTARTUP=$HOME/startup.py

Demo

+0

_Currently, इस स्क्रिप्ट infi: यहाँ कार्रवाई में स्क्रिप्ट का एक डेमो है कुछ त्रुटियों पर नाइट-लूप_ - यदि नाम इरर और क्लीन-अप रूटीन में आयात परिणाम समान आयात करते हैं ... - आप पहले ही जानते हैं कि क्या होता है। आपको यह जांचने की आवश्यकता है कि आप जिस मॉड्यूल को आयात करने का प्रयास कर रहे हैं वह मौजूद है या नहीं। –

+0

@Rogalski मैं यह कैसे करूँगा? मुझे पता है कि 'पीपी' के पास ऐसा करने के तरीके हैं लेकिन कोई भी अपनी स्थानीय मशीन पर कुछ आयात कर सकता है। –

+0

रन: 'कोशिश करें: आयात करने के अलावा जो कुछ भी आयात करें: oops_failed_to_import_handle_it() '? –

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