Как написать скрипт 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