Я пытаюсь создать Python 3 IDE и текстовый редактор на Python, чтобы узнать больше о tkinter
.В нем (потому что - это IDE) я пытаюсь запустить код, введенный пользователем.Лучший способ, который я мог найти, это использовать exec()
.Это работает, как показано на рисунке ниже:
>>> exec(input('PROMPT: '))
PROMPT: print('Hello World') #Entered in by user, this could be anything.
Hello World # <-- Output
Тем не менее, функция exec()
знает о своем окружении.
>>> important_variable = 'important value' #Say that this is important.
>>> exec(input('PROMPT: '))
PROMPT: important_variable = 'meaningless value' #In the IDE, user unknowingly re-assigns to a meaningless value
>>> important_variable #look at the value
'meaningless value' #Yes, the value was changed.
Это не то, что я хочу.Я не хочу никакого подключения к основной программе, кроме значений, которые я ввел (например, изменение значений sys.stdin
, sys.stdout
и sys.stderr
на tkinter
GUI)
Моя идеяЯ должен был использовать расширенное использование функции exec()
(принесено вам help()
):
exec(source, globals=None, locals=None, /)
Execute the given source in the context of globals and locals.
The source may be a string representing one or more Python statements
or a code object as returned by compile().
The globals must be a dictionary and locals can be any mapping,
defaulting to the current globals and locals.
If only globals is given, locals defaults to it.
Я попытался использовать пустой dict для глобалов, и я оставил местных жителей пустыми.Кажется, это работает с первого взгляда.
>>> important_variable = 'important value'
>>> exec_globals = {} #create a black dict of globals
>>> exec(input('PROMPT: '), exec_globals) #pass in the blank dict
PROMPT: important_variable = 'meaningless value' #change to value?
>>> important_variable #look at the value
'important value' #value is kept!
Однако программа, под которой запускался код, видна в исключениях:
>>> exec_globals = {} #create a black dict of globals
>>> exec(input('PROMPT: '), exec_globals) #pass in the blank dict
PROMPT: THIS SHALL CAUSE A ERROR!
Traceback (most recent call last):
File "<pyshell#288>", line 1, in <module>
exec(input('PROMPT: '), exec_globals) # <-- YOU CAN SEE THE CODE
File "<string>", line 1
THIS SHALL CAUSE A ERROR!
^
SyntaxError: invalid syntax
Как мне предотвратить это и удалитьлюбое соединение с программой, как видно из кода, введенного пользователем.Тем не менее, мне все же хотелось бы некоторый контроль в программе, например, изменение значений sys.stdin
, sys.stdout
и sys.stderr
.exec(source, blank_dict)
- это путь или есть лучший способ сделать это?