Show More
@@ -6,7 +6,7 b' Requires Python 2.1 or newer.' | |||
|
6 | 6 | |
|
7 | 7 | This file contains all the classes and helper functions specific to IPython. |
|
8 | 8 | |
|
9 |
$Id: iplib.py 97 |
|
|
9 | $Id: iplib.py 978 2005-12-30 02:37:15Z fperez $ | |
|
10 | 10 | """ |
|
11 | 11 | |
|
12 | 12 | #***************************************************************************** |
@@ -101,8 +101,13 b' def softspace(file, newvalue):' | |||
|
101 | 101 | |
|
102 | 102 | #**************************************************************************** |
|
103 | 103 | # These special functions get installed in the builtin namespace, to provide |
|
104 |
# programmatic (pure python) access to magics |
|
|
105 | # for logging, user scripting, and more. | |
|
104 | # programmatic (pure python) access to magics, aliases and system calls. This | |
|
105 | # is important for logging, user scripting, and more. | |
|
106 | ||
|
107 | # We are basically exposing, via normal python functions, the three mechanisms | |
|
108 | # in which ipython offers special call modes (magics for internal control, | |
|
109 | # aliases for direct system access via pre-selected names, and !cmd for | |
|
110 | # calling arbitrary system commands). | |
|
106 | 111 | |
|
107 | 112 | def ipmagic(arg_s): |
|
108 | 113 | """Call a magic function by name. |
@@ -166,6 +171,11 b' def ipalias(arg_s):' | |||
|
166 | 171 | else: |
|
167 | 172 | error("Alias `%s` not found." % alias_name) |
|
168 | 173 | |
|
174 | def ipsystem(arg_s): | |
|
175 | """Make a system call, using IPython.""" | |
|
176 | __IPYTHON__.system(arg_s) | |
|
177 | ||
|
178 | ||
|
169 | 179 | #**************************************************************************** |
|
170 | 180 | # Local use exceptions |
|
171 | 181 | class SpaceInInput(exceptions.Exception): pass |
@@ -249,9 +259,10 b' class InteractiveShell(Magic):' | |||
|
249 | 259 | # imported code can test for being inside IPython. |
|
250 | 260 | __builtin__.__IPYTHON__ = self |
|
251 | 261 | |
|
252 | # And load into builtins ipmagic/ipalias as well | |
|
253 | __builtin__.ipmagic = ipmagic | |
|
254 | __builtin__.ipalias = ipalias | |
|
262 | # And load into builtins ipmagic/ipalias/ipsystem as well | |
|
263 | __builtin__.ipmagic = ipmagic | |
|
264 | __builtin__.ipalias = ipalias | |
|
265 | __builtin__.ipsystem = ipsystem | |
|
255 | 266 | |
|
256 | 267 | # Add to __builtin__ other parts of IPython's public API |
|
257 | 268 | __builtin__.ip_set_hook = self.set_hook |
@@ -471,8 +482,6 b' class InteractiveShell(Magic):' | |||
|
471 | 482 | |
|
472 | 483 | # Storage |
|
473 | 484 | self.rc = rc # This will hold all configuration information |
|
474 | self.inputcache = [] | |
|
475 | self._boundcache = [] | |
|
476 | 485 | self.pager = 'less' |
|
477 | 486 | # temporary files used for various purposes. Deleted at exit. |
|
478 | 487 | self.tempfiles = [] |
@@ -1217,15 +1226,6 b' want to merge them back into the new files.""" % locals()' | |||
|
1217 | 1226 | # pdb mucks up readline, fix it back |
|
1218 | 1227 | self.readline.set_completer(self.Completer.complete) |
|
1219 | 1228 | |
|
1220 | def update_cache(self, line): | |
|
1221 | """puts line into cache""" | |
|
1222 | return # dbg | |
|
1223 | ||
|
1224 | # This copies the cache every time ... :-( | |
|
1225 | self.inputcache.insert(0, line) | |
|
1226 | if len(self.inputcache) >= self.CACHELENGTH: | |
|
1227 | self.inputcache.pop() # This doesn't :-) | |
|
1228 | ||
|
1229 | 1229 | def mainloop(self,banner=None): |
|
1230 | 1230 | """Creates the local namespace and starts the mainloop. |
|
1231 | 1231 | |
@@ -1462,11 +1462,8 b' want to merge them back into the new files.""" % locals()' | |||
|
1462 | 1462 | # skip blank lines so we don't mess up the prompt counter, but do |
|
1463 | 1463 | # NOT skip even a blank line if we are in a code block (more is |
|
1464 | 1464 | # true) |
|
1465 | #print 'rl line:<%s>' % line # dbg | |
|
1466 | 1465 | if line or more: |
|
1467 | #print 'doit' # dbg | |
|
1468 | newline = self.prefilter(line,more) | |
|
1469 | more = self.push(newline) | |
|
1466 | more = self.push(self.prefilter(line,more)) | |
|
1470 | 1467 | # IPython's runsource returns None if there was an error |
|
1471 | 1468 | # compiling the code. This allows us to stop processing right |
|
1472 | 1469 | # away, so the user gets the error message at the right place. |
@@ -1595,8 +1592,14 b' want to merge them back into the new files.""" % locals()' | |||
|
1595 | 1592 | is left as it was after the line was appended. The return |
|
1596 | 1593 | value is 1 if more input is required, 0 if the line was dealt |
|
1597 | 1594 | with in some way (this is the same as runsource()). |
|
1598 | ||
|
1599 | 1595 | """ |
|
1596 | ||
|
1597 | # autoindent management should be done here, and not in the | |
|
1598 | # interactive loop, since that one is only seen by keyboard input. We | |
|
1599 | # need this done correctly even for code run via runlines (which uses | |
|
1600 | # push). | |
|
1601 | self.autoindent_update(line) | |
|
1602 | ||
|
1600 | 1603 | self.buffer.append(line) |
|
1601 | 1604 | more = self.runsource('\n'.join(self.buffer), self.filename) |
|
1602 | 1605 | if not more: |
@@ -1676,7 +1679,6 b' want to merge them back into the new files.""" % locals()' | |||
|
1676 | 1679 | self._last_input_line = line |
|
1677 | 1680 | |
|
1678 | 1681 | #print '***line: <%s>' % line # dbg |
|
1679 | self.autoindent_update(line) | |
|
1680 | 1682 | |
|
1681 | 1683 | # the input history needs to track even empty lines |
|
1682 | 1684 | if not line.strip(): |
@@ -1798,25 +1800,21 b' want to merge them back into the new files.""" % locals()' | |||
|
1798 | 1800 | # clear the line. The rule will be in this case, that either two |
|
1799 | 1801 | # lines of pure whitespace in a row, or a line of pure whitespace but |
|
1800 | 1802 | # of a size different to the indent level, will exit the input loop. |
|
1803 | ||
|
1801 | 1804 | if (continue_prompt and self.autoindent and isspace(line) and |
|
1802 | 1805 | (line != self.indent_current or isspace(self.buffer[-1]))): |
|
1803 | 1806 | line = '' |
|
1804 | 1807 | |
|
1805 | 1808 | self.log(line,continue_prompt) |
|
1806 | self.update_cache(line) | |
|
1807 | 1809 | return line |
|
1808 | 1810 | |
|
1809 | 1811 | def handle_alias(self,line,continue_prompt=None, |
|
1810 | 1812 | pre=None,iFun=None,theRest=None): |
|
1811 | 1813 | """Handle alias input lines. """ |
|
1812 | 1814 | |
|
1813 |
|
|
|
1814 | # log the ipalias form, which doesn't depend on the instance name | |
|
1815 | line_log = 'ipalias("%s %s")' % (iFun,theRest) | |
|
1816 | self.log(line_log,continue_prompt) | |
|
1817 | self.update_cache(line_log) | |
|
1818 | # this is what actually gets executed | |
|
1819 | return "%s%s.call_alias('%s','%s')" % (pre,self.name,iFun,theRest) | |
|
1815 | line_out = 'ipalias("%s %s")' % (iFun,esc_quotes(theRest)) | |
|
1816 | self.log(line_out,continue_prompt) | |
|
1817 | return line_out | |
|
1820 | 1818 | |
|
1821 | 1819 | def handle_shell_escape(self, line, continue_prompt=None, |
|
1822 | 1820 | pre=None,iFun=None,theRest=None): |
@@ -1829,10 +1827,8 b' want to merge them back into the new files.""" % locals()' | |||
|
1829 | 1827 | print 'SyntaxError: !! is not allowed in multiline statements' |
|
1830 | 1828 | return pre |
|
1831 | 1829 | else: |
|
1832 |
cmd = ("%s %s" % (iFun[1:],theRest)) |
|
|
1833 |
|
|
|
1834 | line_out = '%s%s.system(r"""%s"""[:-1])' % (pre,self.name,cmd + "_") | |
|
1835 | #line_out = ('%s%s.system(' % (pre,self.name)) + repr(cmd) + ')' | |
|
1830 | cmd = ("%s %s" % (iFun[1:],theRest)) | |
|
1831 | line_out = 'ipsystem(r"""%s"""[:-1])' % (cmd + "_") | |
|
1836 | 1832 | else: # single-line input |
|
1837 | 1833 | if line.startswith('!!'): |
|
1838 | 1834 | # rewrite iFun/theRest to properly hold the call to %sx and |
@@ -1843,16 +1839,10 b' want to merge them back into the new files.""" % locals()' | |||
|
1843 | 1839 | return self.handle_magic('%ssx %s' % (self.ESC_MAGIC,line[2:]), |
|
1844 | 1840 | continue_prompt,pre,iFun,theRest) |
|
1845 | 1841 | else: |
|
1846 | #cmd = esc_quotes(line[1:]) | |
|
1847 | 1842 | cmd=line[1:] |
|
1848 |
|
|
|
1849 | line_out = '%s.system(r"""%s"""[:-1])' % (self.name,cmd +"_") | |
|
1850 | #line_out = ('%s.system(' % self.name) + repr(cmd)+ ')' | |
|
1843 | line_out = 'ipsystem(r"""%s"""[:-1])' % (cmd +"_") | |
|
1851 | 1844 | # update cache/log and return |
|
1852 | 1845 | self.log(line_out,continue_prompt) |
|
1853 | self.update_cache(line_out) # readline cache gets normal line | |
|
1854 | #print 'line out r:', `line_out` # dbg | |
|
1855 | #print 'line out s:', line_out # dbg | |
|
1856 | 1846 | return line_out |
|
1857 | 1847 | |
|
1858 | 1848 | def handle_magic(self, line, continue_prompt=None, |
@@ -1863,7 +1853,6 b' want to merge them back into the new files.""" % locals()' | |||
|
1863 | 1853 | |
|
1864 | 1854 | cmd = '%sipmagic("%s")' % (pre,esc_quotes('%s %s' % (iFun,theRest))) |
|
1865 | 1855 | self.log(cmd,continue_prompt) |
|
1866 | self.update_cache(line) | |
|
1867 | 1856 | #print 'in handle_magic, cmd=<%s>' % cmd # dbg |
|
1868 | 1857 | return cmd |
|
1869 | 1858 | |
@@ -1921,7 +1910,6 b' want to merge them back into the new files.""" % locals()' | |||
|
1921 | 1910 | elif line[-1]==self.ESC_HELP: |
|
1922 | 1911 | line = line[:-1] |
|
1923 | 1912 | self.log('#?'+line) |
|
1924 | self.update_cache(line) | |
|
1925 | 1913 | if line: |
|
1926 | 1914 | self.magic_pinfo(line) |
|
1927 | 1915 | else: |
@@ -2019,8 +2007,6 b' want to merge them back into the new files.""" % locals()' | |||
|
2019 | 2007 | # don't re-insert logger status info into cache |
|
2020 | 2008 | if line.startswith('#log#'): |
|
2021 | 2009 | continue |
|
2022 | elif line.startswith('#!'): | |
|
2023 | self.update_cache(line[1:]) | |
|
2024 | 2010 | else: |
|
2025 | 2011 | # build a block of code (maybe a single line) for execution |
|
2026 | 2012 | block = line |
@@ -2038,7 +2024,6 b' want to merge them back into the new files.""" % locals()' | |||
|
2038 | 2024 | # now execute the block of one or more lines |
|
2039 | 2025 | try: |
|
2040 | 2026 | exec block in globs,locs |
|
2041 | self.update_cache(block.rstrip()) | |
|
2042 | 2027 | except SystemExit: |
|
2043 | 2028 | pass |
|
2044 | 2029 | except: |
@@ -9,6 +9,13 b'' | |||
|
9 | 9 | 'y' has side effects, doesn't trigger the side effect TWICE. It |
|
10 | 10 | is important to note that, with autocall on, these side effects |
|
11 | 11 | can still happen. |
|
12 | (ipsystem): new builtin, to complete the ip{magic/alias/system} | |
|
13 | trio. IPython offers these three kinds of special calls which are | |
|
14 | not python code, and it's a good thing to have their call method | |
|
15 | be accessible as pure python functions (not just special syntax at | |
|
16 | the command line). It gives us a better internal implementation | |
|
17 | structure, as well as exposing these for user scripting more | |
|
18 | cleanly. | |
|
12 | 19 | |
|
13 | 20 | * IPython/macro.py (Macro.__init__): moved macros to a standalone |
|
14 | 21 | file. Now that they'll be more likely to be used with the |
General Comments 0
You need to be logged in to leave comments.
Login now