Как написать скрипт Python, который может получать и выполнять команды Python?

Я довольно новичок в Python. Я пытаюсь изменить скрипт так, чтобы он работал в бесконечном цикле, получал строки кода Python из консоли и выполнял строки кода Python.

Я говорю о том, что может сделать следующий пример:

Shell> myconsole.py  
> PredefindFunction ("Hello")  
This is the result of the PredefinedFunction: Hello!!!  
> a=1  
> if a==1:  
>     print "a=1"  
a=1  
> quit  
Shell>  

Я пытался использовать функцию exec(). Он хорошо работает с запуском функций, которые я определил в моем скрипте, но по какой-то причине не может выполнить весь код. Я не понимаю его логику. Я получил:

Shell> myconsole.py  
> PredefindFunction ("Hello")  
This is the result of the PredefinedFunction: Hello!!!  
> a=1  
> print a 
...
NameError: name 'a' is not defined  
Shell>  

Может кто-нибудь помочь, пожалуйста?

Спасибо,
Гур


Привет кайл

Вот код:

class cParseTermCmd:  
    def __init__(self, line = ""):  
        self.TermPrompt = "t>"  
        self.oTermPrompt = re.compile("t>", re.IGNORECASE)  
        self.TermCmdLine = ""  
        self.line = line  

    # Check if the TermPrompt (t>) exist in line
    def mIsTermCmd (self):
        return self.oTermPrompt.match(self.line)

    # Remove the term prompt from the terminal command line  
    def mParseTermCmd (self):  
        self.TermCmdLine = re.sub(r'%s'%self.TermPrompt, '', self.line, flags=re.IGNORECASE)  
        exec (self.TermCmdLine)  


And I call it in an infinite while loop from:  
def GetCmd (self):  
            line = raw_input('>')  
            self.TermCmdLine = cParseTermCmd(line)  
            if self.TermCmdLine.mIsTermCmd():  
                # Execute terminal command  
                self.TermCmdLine.mParseTermCmd()  
            else:  
                return line  

1 ответ

Решение

Похоже, вы пытаетесь создать собственную оболочку Python. Как и обычный интерактивный интерпретатор Python, но с несколькими предопределенными функциями. Модуль кода может сделать это для вас.

Давайте создадим оболочку с одной предопределенной функцией:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import readline  # not really required, but allows you to
                 # navigate with your arrow keys
import code


def predefined_function():
    return "whoop!"

vars = globals().copy()
vars.update(locals())
shell = code.InteractiveConsole(vars)
shell.interact()

(Код с благодарностью украден из этого ответа.)

Теперь давайте запустим это, не так ли?

$ python pyshell.py
Python 2.7.5 |Anaconda 1.8.0 (64-bit)| (default, Jul  1 2013, 12:37:52) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> predefined_function()
'whoop!'
>>> a = 1
>>> print (a + 1)
2
Другие вопросы по тегам