выполнить строку как код python
Как мне выполнить строку, содержащую код Python в Python?
Как мне выполнить строку, содержащую код Python в Python?
13 ответов
В этом примере строка выполняется как код с использованием функции exec.
Но, если ваш код содержит переменные, вы можете использовать «глобальный» для доступа к нему, а также, чтобы компилятор не вызвал следующую ошибку:
NameError: имя ‘p_variable’ не определено
Если вам нужно значение выражения, используйте eval(string) :
Тем не менее, первым шагом должно быть спросить себя, действительно ли вам это нужно. Выполнение кода, как правило, должно быть последним средством: он медленный, безобразный и опасный, если он может содержать введенный пользователем код. Вы всегда должны сначала искать альтернативы, такие как функции высшего порядка, чтобы увидеть, могут ли они лучше удовлетворить ваши потребности.
eval и exec являются правильным решением, и их можно использовать более безопасным способом.
Как описано в Справочное руководство по Python и ясно объяснено в этом руководстве, eval и <
По сути, вы определяете пространство имен, в котором будет выполняться код.
Я закончил тем, что создал файлы в файловой системе в папке customer_filters и использовал модуль imp, если для этого клиента не применен фильтр, он просто продолжил
Поэтому customerName = «jj» будет выполнять apply_address_filter из файла customer_filters \ jj_filter.py
eval() только для выражений, в то время как eval(‘x+1’) работает, eval(‘x=1’) не будет работать, например. В этом случае лучше использовать exec или даже лучше: попробуйте найти лучшее решение 🙂
Избегайте exec и eval
Использование exec и eval в Python вызывает неодобрение.
Есть лучшие альтернативы
Сверху ответ (выделение мое):
установить и получить значения переменных с именами в строках
[Хотя eval ] будет работать, обычно не рекомендуется использовать имена переменных, имеющие значение для самой программы.
Вместо этого лучше использовать диктовку.
Это не идиоматично
Python это не PHP
Это опасно
Так что Eval не является безопасным, даже если вы удалите все глобальные и встроенные!
Итак, можно ли сделать eval безопасным? Тяжело сказать. На данный момент, я думаю, что вы не можете причинить вреда, если не можете использовать двойные подчеркивания, поэтому, возможно, если вы исключите любую строку с двойным подчеркиванием, вы в безопасности. Может быть.
Трудно читать и понимать
Вы выполняете код, используя exec, как в следующем сеансе IDLE:
Как выполнить строку, содержащую код Python в Python?
Как выполнить строку, содержащую код Python в Python?
12 ответов
для утверждения, используйте exec(string) (в Python 2/3) или exec string (Python 2):
когда вам нужно значение выражения, использовать eval(string) :
однако первым шагом должно быть спросить себя, действительно ли вам это нужно. Выполнение кода обычно должно быть последним средством: он медленный, уродливый и опасный, если он может содержать введенный пользователем код. Вы всегда должны смотреть на альтернативы в первую очередь, такие как функции более высокого порядка, чтобы увидеть, могут ли они лучше удовлетворить ваши потребности.
в примере строка выполняется как код с помощью функции exec.
eval и exec являются правильным решением, и их можно использовать в безопасное порядке.
как говорится в справочное руководство Python и ясно объяснено в этой руководства eval и exec функции принимают два дополнительных параметра, которые позволяют пользователю указать, какие глобальные и локальные функции и переменные доступны.
по существу вы определяете пространство имен, в котором будет выполняться код.
вы выполняете код с помощью exec, как и в следующем сеансе ожидания:
избежать exec и eval
используя exec и eval в Python очень неодобрительно.
есть лучшие альтернативы
из верхнего ответа (акцент мой):
однако первым шагом должно быть спросить себя, действительно ли вам это нужно. выполнение кода должно как правило, позиция последней инстанции: это медленно, уродливо и опасно, если он может содержать введенный пользователем код. Вы всегда должны смотреть на альтернативы во-первых, такие как функции высшего порядка, чтобы увидеть, если они могут лучше удовлетворить ваши потребности.
установить и получить значения переменных с именами в строках
[while eval ] будет работать, как правило, нет рекомендуется использовать имена переменных, имеющие значение для самой программы.
вместо этого лучше использовать dict.
это не идиоматические
Python не PHP
не пытайтесь обойти идиомы Python, потому что некоторые другие языки делают это по-другому. Пространства имен в Python и просто потому что это дает вам инструмент exec Это не означает, что вы должны использовать этот инструмент.
опасно
таким образом, eval не является безопасным, даже если вы удалите все глобалы и встроенные!
проблема со всеми этими попытки защитить eval () заключается в том, что они являются черными списками. Они явно удалите вещи, которые могут быть опасными. Это проигранная битва, потому что если в списке остался только один элемент, вы можете атаковать систему.
Итак, можно ли сделать eval безопасным? Трудно сказать. На данный момент я думаю, что вы не можете причинить никакого вреда, если не можете использовать двойные подчеркивания, поэтому, возможно, если вы исключите любую строку с двойными подчеркиваниями, вы в безопасности. Возможно.
трудно читать и пойми!—14—>
во-первых, exec затрудняет людям чтение вашего кода. Чтобы понять, что происходит, мне не просто нужно прочитать ваш код,я должен прочитать ваш код, выяснить, какую строку он собирается генерировать, а затем прочитать этот виртуальный код. Итак, если вы работаете в команде, или публикация программного обеспечения с открытым исходным кодом или обращение за помощью к кому-то вроде StackOverflow затрудняют помощь других людей. И если есть шанс, что вы собираетесь отлаживать или расширять этот код через 6 месяцев, вы усложняете его для себя напрямую.
How do I execute a string containing Python code in Python?
How do I execute a string containing Python code in Python?
14 Answers 14
For statements, use exec(string) (Python 2/3) or exec string (Python 2):
When you need the value of an expression, use eval(string) :
However, the first step should be to ask yourself if you really need to. Executing code should generally be the position of last resort: It’s slow, ugly and dangerous if it can contain user-entered code. You should always look at alternatives first, such as higher order functions, to see if these can better meet your needs.
In the example a string is executed as code using the exec function.
eval and exec are the correct solution, and they can be used in a safer manner.
As discussed in Python’s reference manual and clearly explained in this tutorial, the eval and exec functions take two extra parameters that allow a user to specify what global and local functions and variables are available.
In essence you are defining the namespace in which the code will be executed.
Avoid exec and eval
Using exec and eval in Python is highly frowned upon.
There are better alternatives
From the top answer (emphasis mine):
However, the first step should be to ask yourself if you really need to. Executing code should generally be the position of last resort: It’s slow, ugly and dangerous if it can contain user-entered code. You should always look at alternatives first, such as higher order functions, to see if these can better meet your needs.
set and get values of variables with the names in strings
[while eval ] would work, it is generally not advised to use variable names bearing a meaning to the program itself.
Instead, better use a dict.
It is not idiomatic
Python is not PHP
Don’t try to circumvent Python idioms because some other language does it differently. Namespaces are in Python for a reason and just because it gives you the tool exec it does not mean you should use that tool.
It is dangerous
So eval is not safe, even if you remove all the globals and the builtins!
The problem with all of these attempts to protect eval() is that they are blacklists. They explicitly remove things that could be dangerous. That is a losing battle because if there’s just one item left off the list, you can attack the system.
So, can eval be made safe? Hard to say. At this point, my best guess is that you can’t do any harm if you can’t use any double underscores, so maybe if you exclude any string with double underscores you are safe. Maybe.
It is hard to read and understand
First, exec makes it harder to human beings to read your code. In order to figure out what’s happening, I don’t just have to read your code, I have to read your code, figure out what string it’s going to generate, then read that virtual code. So, if you’re working on a team, or publishing open source software, or asking for help somewhere like StackOverflow, you’re making it harder for other people to help you. And if there’s any chance that you’re going to be debugging or expanding on this code 6 months from now, you’re making it harder for yourself directly.
Запуск Python и python-скрипт на компьютере
Код, написанный на языке Python, может храниться в редакторе кода, IDE или файле. И он не будет работать, если не знать, как его правильно запускать.
В этом материале рассмотрим 7 способов запуска кода, написанного на Python. Они будут работать вне зависимости от операционной системы, среды Python или местоположения кода.
Где запускать Python-скрипты и как?
Python-код можно запустить одним из следующих способов:
Запуск Python-кода интерактивно
Для запуска интерактивной сессии нужно просто открыть терминал или командную строку и ввести python (или python3 в зависимости от версии). После нажатия Enter запустится интерактивный режим.
Вот как запустить интерактивный режим в разных ОС.
Интерактивный режим в Linux
Откройте терминал. Он должен выглядеть приблизительно вот так :
После нажатия Enter будет запущен интерактивный режим Python.
Интерактивный режим в macOS
На устройствах с macOS все работает похожим образом. Изображение ниже демонстрирует интерактивный режим в этой ОС.
Интерактивный режим в Windows
Запуск Python-скриптов в интерактивном режиме
В таком режиме можно писать код и исполнять его, чтобы получить желаемый результат или отчет об ошибке. Возьмем в качестве примера следующий цикл.
Для выхода из интерактивного режима нужно написать следующее:
И нажать Enter. Вы вернетесь в терминал, из которого и начинали.
Есть и другие способы остановки работы с интерактивным режимом Python. В Linux нужно нажать Ctrl + D, а в Windows — Ctrl + Z + Enter.
Стоит отметить, что при использовании этого режима Python-скрипты не сохраняются в локальный файл.
Как выполняются Python-скрипты?
Отличный способ представить, что происходит при выполнении Python-скрипта, — использовать диаграмму ниже. Этот блок представляет собой скрипт (или функцию) Python, а каждый внутренний блок — строка кода.
При запуске скрипта интерпретатор Python проходит сверху вниз, выполняя каждую из них. Именно таким образом происходит выполнение кода.
Но и это еще не все.
Блок-схема выполнения кода интерпретатором
Это набор инструкций, которые приводят к финальному результату.
Иногда полезно изучать байткод. Если вы планируете стать опытным Python-программистом, то важно уметь понимать его для написания качественного кода.
Это также пригодится для принятия решений в процессе. Можно обратить внимание на отдельные факторы и понять, почему определенные функции/структуры данных работают быстрее остальных.
Как запускать Python-скрипты?
Для запуска Python-скрипта с помощью командной строки сначала нужно сохранить код в локальный файл.
Возьмем в качестве примера файл, который был сохранен как python_script.py. Сохранить его можно вот так:
Сохранить скрипт в текстовом редакторе достаточно легко. Процесс ничем не отличается от сохранения простого текстового файла.
Но если использовать командную строку, то здесь нужны дополнительные шаги. Во-первых, в самом терминале нужно перейти в директорию, где должен быть сохранен файл. Оказавшись в нужной папке, следует выполнить следующую команду (на linux):
После нажатия Enter откроется интерфейс командной строки, который выглядит приблизительно следующим образом:
Теперь можно писать код и с легкостью сохранять его прямо в командной строке.
Как запускать скрипт в командной строке?
Как выполнить строку, содержащую код Python в Python?
Как выполнить строку, содержащую код Python в Python?
Для операторов используйте exec(string) (Python 2/3) или exec string (Python 2):
Когда вам нужно значение выражения, используйте eval(string) :
Тем не менее, первым шагом должно быть спросить себя, действительно ли вам это нужно. Выполнение кода, как правило, должно быть последним средством: он медленный, безобразный и опасный, если он может содержать введенный пользователем код. Вы всегда должны сначала смотреть на альтернативы, такие как функции высшего порядка, чтобы увидеть, могут ли они лучше удовлетворить ваши потребности.
В этом примере строка выполняется как код с использованием функции exec.
eval и exec являются правильным решением, и они могут быть использованы более безопасным способом.
По сути, вы определяете пространство имен, в котором будет выполняться код.
eval() только для выражений, хотя eval(‘x+1’) работает, eval(‘x=1’) не будет работать, например. В этом случае лучше использовать exec или даже лучше: попробуйте найти лучшее решение 🙂
Избегайте exec и eval
Использование exec и eval в Python весьма неодобрительно.
Есть лучшие альтернативы
С верху ответ (акцент мой):
установить и получить значения переменных с именами в строках
[while eval ] будет работать, как правило, не рекомендуется использовать имена переменных, имеющие значение для самой программы.
Вместо этого лучше использовать диктовку.
Это не идиоматично
Python это не PHP
Не пытайтесь обойти идиомы Python, потому что другой язык делает это по-другому. Пространства имен есть в Python по причине и только потому, что она дает вам инструмент, exec но это не значит, что вы должны использовать этот инструмент.
Это опасно
Так что Eval не является безопасным, даже если вы удалите все глобальные и встроенные!
Итак, можно ли сделать eval безопасным? Тяжело сказать. На данный момент, я думаю, вы не можете причинить вреда, если не можете использовать двойные подчеркивания, поэтому, возможно, если вы исключите любую строку с двойным подчеркиванием, вы в безопасности. Может быть.