Python exec ()

Kaedah exec () melaksanakan program yang dibuat secara dinamik, baik berupa tali atau objek kod.

Sintaks exec():

 exec (objek, global, penduduk tempatan)

exec () Parameter

exec() mengambil tiga parameter:

  • objek - Sama ada rentetan atau objek kod
  • global (pilihan) - kamus
  • penduduk tempatan (pilihan) - objek pemetaan. Kamus adalah jenis pemetaan standard dan biasa digunakan di Python.

Penggunaan global dan penduduk tempatan akan dibincangkan kemudian dalam artikel.

Nilai Pulangan dari exec ()

exec()tidak mengembalikan nilai, ia kembali None.

Contoh 1: Bagaimana exec () berfungsi?

 program = 'a = 5b=10print("Sum =", a+b)' exec(program)

Pengeluaran

 Jumlah = 15

Di sini, program objek rentetan diserahkan kepada exec()yang melaksanakan program tersebut. global dan penduduk tempatan diabaikan dalam kes ini.

Contoh 2: Benarkan pengguna memberikan input

  program = input('Enter a program:') exec(program) 

Pengeluaran

 Masukkan program: (cetak (item) untuk item di (1, 2, 3)) 1 2 3

Sekiranya anda ingin mengambil kod Python dari pengguna yang membenarkan kod multiline (menggunakan ''), anda boleh menggunakan compile()kaedah sebelum menggunakannya exec().

Ketahui lebih lanjut mengenai kaedah kompilasi () di Python.

Berhati-hati semasa menggunakan exec ()

Pertimbangkan keadaan, anda menggunakan sistem Unix (macOS, Linux dll) dan anda telah mengimport osmodul. Modul os menyediakan cara mudah alih untuk menggunakan fungsi sistem operasi seperti membaca atau menulis fail.

Jika Anda mengizinkan pengguna memasukkan nilai menggunakan exec(input()), pengguna dapat mengeluarkan perintah untuk mengubah file atau bahkan menghapus semua file menggunakan perintah tersebut os.system('rm -rf *').

Sekiranya anda menggunakan exec(input())kod anda, ada baiknya anda memeriksa pemboleh ubah dan kaedah mana yang boleh digunakan pengguna. Anda dapat melihat pemboleh ubah dan kaedah mana yang tersedia menggunakan kaedah dir ().

 from math import * exec('print(dir())')

Pengeluaran

('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', ' lantai ',' 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')

Mengehadkan Penggunaan Kaedah dan Pemboleh ubah yang Tersedia di exec ()

Lebih kerap daripada tidak, semua kaedah dan pemboleh ubah yang tersedia exec()mungkin tidak diperlukan, atau mungkin mempunyai lubang keselamatan. Anda boleh mengehadkan penggunaan pemboleh ubah dan kaedah ini dengan memasukkan parameter (kamus) global dan tempatan pilihan kepada exec()kaedah.

1. Kedua-dua parameter global dan penduduk tempatan dihilangkan

Sekiranya kedua-dua parameter tersebut dihilangkan (seperti dalam contoh sebelumnya), kod yang diharapkan dapat dijalankan exec()dilaksanakan dalam skop saat ini. Anda boleh memeriksa pemboleh ubah dan kaedah yang ada menggunakan kod berikut:

 exec ('cetak (dir ())')

2. Melewatkan parameter global; parameter penduduk diabaikan

Parameter global dan tempatan (kamus) masing-masing digunakan untuk pemboleh ubah global dan tempatan. Sekiranya kamus penduduk tempatan ditinggalkan, ia akan menjadi kamus global. Maknanya, global akan digunakan untuk pemboleh ubah global dan tempatan.

Catatan: Anda boleh menyemak kamus global dan tempatan semasa di Python masing-masing menggunakan kaedah bawaan global () dan penduduk tempatan ().

3. Menyampaikan kamus kosong sebagai parameter global

 from math import * exec('print(dir())', ()) # This code will raise an exception # exec('print(sqrt(9))', ())

Sekiranya anda memberikan kamus kosong sebagai global, hanya __builtins__yang tersedia untuk object(parameter pertama ke exec ()). Walaupun kami telah mengimport modul matematik dalam program di atas, cuba mengakses salah satu fungsi yang disediakan oleh modul matematik akan menimbulkan pengecualian.

Pengeluaran

 ('__builtins__')

Menyediakan Kaedah tertentu

 from math import * exec('print(dir())', ('sqrt': sqrt, 'pow': pow)) # object can have sqrt() module exec('print(sqrt(9))', ('sqrt': sqrt, 'pow': pow))

Here, the code that is executed by exec() can also have sqrt() and pow() methods along with __builtins__.

It's possible to change the name of the method according to your wish.

 from math import * exec('print(dir())', ('squareRoot': sqrt, 'pow': pow)) # object can have squareRoot() module exec('print(squareRoot(9))', ('squareRoot': sqrt, 'pow': pow))

In the above program, squareRoot() calculates the square root (similar functionality like sqrt()). However, trying to use sqrt() will raise an exception.

Restricting the Use of built-ins

You can restrict the use of __builtins__ by giving value None to the '__builtins__' in the globals dictionary.

 exec(object, ('__builtins__': None)) 

4. Passing both globals and locals dictionary

You can make needed functions and variables available for use by passing locals dictionary. For example:

 from math import * globalsParameter = ('__builtins__' : None) localsParameter = ('print': print, 'dir': dir) exec('print(dir())', globalsParameter, localsParameter)

Output

 ('dir', 'print') 

Di sini, hanya dua kaedah terbina dalam cetak () dan dir () yang dapat dilaksanakan dengan exec()kaedah.

Penting untuk diperhatikan bahawa, exec()melaksanakan kod dan tidak mengembalikan nilai (return None). Oleh itu, anda tidak boleh menggunakan pernyataan pulangan dan hasil di luar definisi fungsi.

Artikel menarik...