0

Я довольно новичок в 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 
+0

Можете ли вы опубликовать часть кода, который вы сделали до сих пор? Я получаю, что у вас возникают проблемы с этими двумя строками: 'exec ('a = 2'); print (a) ' –

+0

Привет, Кайл, я добавил его к вопросу. Благодаря! –

ответ

2

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

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

#!/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() 

(Код благодарно украдена из this answer.)

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

$ 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 
+0

Спасибо Карстен! Это отлично работает! Как мне вернуться в бесконечный цикл в моем сценарии, чтобы я мог запускать другие команды после того, как пользователь ввел некоторые команды в интерактивном режиме? –

+1

Найдено: CTRL-Z \t Спасибо! –

+0

@GurArie Да, должен быть Ctrl + Z на Windows и Ctrl + D везде. Но учтите, что это не сработает, если вы выйдете из оболочки, написав 'exit()'. Это просто закончит программу. – Carsten

Смежные вопросы