2015-07-29 4 views
-1

Я хочу сохранить фрагмент кода в txt-файле и выполнить его из моего сценария Python.Python как выполнить код из txt-файла

Например, в текстовом файле есть

print("ok")

Я хочу, чтобы моя программа для печати ok и не печатать print("ok "). Как я могу это сделать?

+0

Добро пожаловать в переполнение стека! Кажется, вы просите кого-нибудь написать для вас какой-то код. Переполнение стека - это вопрос и ответ, а не служба написания кода. Пожалуйста, [см. Здесь] (http://stackoverflow.com/help/how-to-ask), чтобы узнать, как писать эффективные вопросы. –

+2

Вы почти никогда не хотите этого делать, но если вы это сделаете, найдите exec. Ужасная вещь. * содрогания * – muddyfish

+0

https://docs.python.org/2/library/functions.html#execfile – Rishav

ответ

1

Вы ищете eval функции

eval это функция, которая принимает произвольный питона код, представленный в виде строки и выполнить его во время выполнения.

Пример

>>> x = 1 
>>> y = eval('x+1') 
>>> print(y) 
2 

Он работает в обоих 2.x и 3.x Python

Проверьте документацию: https://docs.python.org/2.7/library/functions.html#eval

+2

Нет, нет! eval() оценивает выражения Python, он не выполняет произвольный код. Попробуйте: 'eval ("print' abcd '")', и вы получите SyntaxError. : D Но вы только наполовину ошибаетесь, поскольку eval() позволяет выполнять объекты кода, и они могут содержать что угодно, а не только выражения. Итак: 'eval (compile ("print' abcd '", "blah.py", "exec"))' будет работать. – Dalen

+0

Спасибо за информацию! В следующий раз я отвечу, прежде чем ответить –

2

Делать то, что вы хотите, как правило, представляет собой угрозу безопасности , но не обязательно так.

Вам обязательно нужно уведомить пользователя о потенциальном риске.

Существует более одной программы, использующей команды execfile() или compile() и exec для предоставления плагинов.

В этом нет ничего уродливого, вы просто должны знать, что вы делаете, когда и где.

И execfile(), eval() и оператор exec позволяют указать область, в которой будет выполняться/оцениваться ваш код.

myscope = {} 
execfile("myfile.txt", myscope) 

Это предотвратит смешение нового кода со старым. Все классы переменных, функции и модули из myfile.txt будут содержаться в словаре myscope.

Это, однако, не позволяет вредоносному коду удалять все файлы, которые могут быть с вашего диска, или что-то подобное.

Python 2 имеет хороший модуль под названием rexec, но из Python 2.2 он больше не работает.

В нем реализована инструкция execfile() exec и eval() в ограниченной среде. Хотя он не работает, он есть, и вы можете прорыть код, чтобы узнать, как это делается.

Итак, вы можете разрешить выполнение только защищенного кода (ну, как можно безопаснее) от внешнего источника.

Есть и другой способ. Вы можете загрузить файл, скомпилировать его код и затем проверить его, чтобы узнать, что он делает. Тогда скажите, да, я исполню это или нет, не буду. Это, однако, немного больше работы и много осложнений.

Но, я не думаю, что вам нужно будет пройти через все это. Расскажите подробнее о своей проблеме. Что именно вы имеете в виду под редакцией уровня? Я не думаю, что внешний код является для этого решением.

+0

Итак, моя игра - космический корабль, который может снимать монстров в основном, так что редактор уровней предназначен для простого создания уровня (выбирает тип монстров, когда он появляется, выбирает фон и т. Д.) Для например, для создания монстра его 5 строк кода, поэтому, когда пользователь нажимает кнопку нового монстра, он автоматически записывает эти 5 строк с его параметрами в txt-файле. Это мой план, если у вас есть другая идея, пожалуйста, скажите мне – luka

+0

У вас есть монстр, представленный как объект, который я принимаю. Если это так, то тривиально изменить его атрибуты, чтобы отразить то, что вы хотите. У вас может быть больше типов монстров, определенных и во время выполнения, что-то вроде: 'newmonster = object(); newmonster.speed = 50; для x in dir (крокодил): setattr (newmonster, x, getattr (крокодил, x)) '. Таким образом, вы создадите нового крокодила со скоростью 50. Вы можете, конечно, автоматизировать все это умным образом наследуемым. – Dalen

+0

Чтобы сохранить все это, вы можете использовать модуль configparser для сохранения только выбранных значений атрибутов в качестве INI-файла или создания собственного файла или использовать модуль pickle/cPickle, чтобы сохранить их как «import cPickle as pickle; f = open ("newmonster.txt", "wb"); pickle.dump (newmonster, f); f.close() «Загрузка будет выполнена с использованием pickle.load(), , но сделать это с динамически заполненными объектами будет немного сложно. Но это сработает. – Dalen

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