English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
ي�行 طريقة exec() برامج يتم إنشاؤها ديناميكياً، ويمكن أن تكون سلسلة أو كائن برمجي.
نصوص syntax لـ exec()
exec(object, globals, locals)
يأخذ exec() ثلاثة معلمات:
كائن - سلسلة أو كائن البرنامج
globals ـ(اختياري) - الدليل
localsـ(اختياري) - كائن الت映射. الدليل هو نوع الت映射 القياسي المستخدم في بايثون.
سيتم مناقشتها لاحقاً في هذا المقالالمتغيرات العالمية(globals) و (locals)محليالمتغيرالاستخدام.
لا يعود exec() بأي قيمة، بل يعود بلا شيء (None).
برنامج = 'a = 5\nb=10\nإدراج("المجموع =", a+b)' exec(program)
运行该程序时,输出为:
المجموع = 15
في هذا السياق، يتم تمرير كائن السلسلة البرنامج إلى exec() الذي ي�行 البرنامج. في هذا المثال، تم إغفال المتغيرات العالمية (globals) والمحلية (locals)المتغيرات المحلية.
برنامج = إدخال('إدخال البرنامج:') exec(program)
运行该程序时,输出为:
输入程序: [print(item) for item in [1, 2, 3]] 1 2 3
如果要从允许多行代码的用户处获取Python代码(使用'\n'),则可以在使用exec()之前使用compile()方法。
了解有关Python中的compile()方法更多信息。
考虑一种情况,您正在使用Unix系统(macOS,Linux等),并且已导入os模块。os模块提供了使用操作系统功能的便携式方法,例如:读取或写入文件。
如果允许用户使用来输入值exec(input()),则用户可以发出命令来更改文件,甚至可以使用command删除所有文件os.system('rm -rf *')。
如果exec(input())在代码中使用,最好检查用户可以使用哪些变量和方法。您可以使用dir()方法查看可用的变量和方法。
from math import * exec('print(dir())')
运行该程序时,输出为:
['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__name__', '_dh', '_i', '_i1', '_i2', '_ih', '_ii', '_iii', '_oh', '_sh', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'get_ipython', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'quit', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
عادةً، لا تحتاج إلى استخدام جميع الطرق والمتغيرات المتاحة في exec()، وقد تكون هناك ثغرات أمنية. يمكنك تقييد استخدام الطرق والمتغيرات المتاحة في exec() عن طريق تمريرglobals和localsتم تمرير المعاملات (قاموس) إلى دالة exec() لتقييد استخدام هذه المتغيرات والطرق.
إذا تم تمرير كلا المعاملين (كما في مثالنا السابق)، فإن exec() يتوقع تنفيذ الكود في النطاق الحالي. يمكنك استخدام الكود التالي لفحص المتغيرات والطرق المتاحة:
exec('print(dir())')
(globals) و (locals)المعاملالقاموس (، للاعتبارات العالمية والمحلية). إذا تم تمريرlocalsالقاموس، إذا لم يتم تقديم القاموس، فإن القيمة الافتراضية هيglobalsالمعنى هو أنالغيرية (globals)globals)ستستخدم للاعتبارات العالمية والمحلية.
ملاحظة:يمكنك استخدامها على التواليglobals()和locals()تقوم الطرق المدمجة في Python بفحص القاموس العالمي والقاموس المحلي الحالي.
from math import * # exec('print(dir())', {}) # هذا الكود سيؤدي إلى استثنائية # exec('print(sqrt(9))', {})
إذا تم تقديم قاموس فارغ كglobalsإذا تم تمريرها، يمكن استخدام فقط __builtins__ من قبل الكائن (المستلم الأول لـ exec()) حتى لو قمنا بجلب مكتبة math في البرنامج السابق، وحاولنا الوصول إلىمكتبة mathستؤدي أي دالة تقدمها إلى إطلاق استثناء.
运行该程序时,输出为:
__builtins__
from math import * exec('print(dir())', {'sqrt': sqrt, 'pow': pow}) # يمكن أن يكون المثال المطلوب sqrt() كجزء من الكائن exec('print(sqrt(9))', {'sqrt': sqrt, 'pow': pow})
في هذا السياق، يمكن أن يكون الكود الذي يتم تنفيذه بواسطة exec() يحتوي أيضًا على طرق sqrt() وpow() و __builtins__.
يمكنك تغيير اسم الطريقة حسب رغبتك.
from math import * exec('print(dir())', {'squareRoot': sqrt, 'pow': pow}) # 对象可以具有squareRoot()模块 exec('print(squareRoot(9))', {'squareRoot': sqrt, 'pow': pow})
在上述程序中,squareRoot()计算平方根(类似的功能,如sqrt())。但是,尝试使用sqrt()将引发异常。
您可以通过在globals字典中为__builtins__赋值None,来限制__builtins__的使用。
exec(object, {'__builtins__': None})
您可以通过传递本地(locals)字典来使所需的函数和变量可用。例如:
from math import * globalsParameter = {'__builtins__' : None} localsParameter = {'print': print, 'dir': dir} exec('print(dir())', globalsParameter, localsParameter)
运行该程序时,输出为:
['dir', 'print']
在这里,exec()方法只能执行两个内置方法print()和dir()。
需要特别注意的是,exec()执行代码,并且不返回任何值(返回None)。因此,您不能在函数定义之外使用return和yield语句。