Python exec ()

Exec () yöntemi, bir dize veya kod nesnesi olan dinamik olarak oluşturulmuş programı yürütür.

Sözdizimi exec():

 exec (nesne, küreseller, yereller)

exec () Parametreler

exec() üç parametre alır:

  • nesne - Bir dizge veya kod nesnesi
  • globals (isteğe bağlı) - bir sözlük
  • yereller (isteğe bağlı) - bir eşleme nesnesi. Sözlük, Python'da standart ve yaygın olarak kullanılan eşleme türüdür.

Küresel ve yerel halkın kullanımı makalenin ilerleyen kısımlarında tartışılacaktır.

Exec () dönüş değeri

exec()herhangi bir değer döndürmez, geri döner None.

Örnek 1: exec () nasıl çalışır?

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

Çıktı

 Toplam = 15

Burada, programı exec()çalıştıran dizi nesnesi programı geçirilir . bu durumda küreseller ve yereller ihmal edilir.

Örnek 2: Kullanıcının girdi sağlamasına izin ver

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

Çıktı

 Bir program girin: ((1, 2, 3) içindeki öğe için (öğe) yazdır) 1 2 3

Kullanıcıdan çok satırlı koda (kullanarak '') izin veren Python kodunu almak istiyorsanız, kullanmadan compile()önce yöntemi kullanabilirsiniz exec().

Python'da compile () yöntemi hakkında daha fazla bilgi edinin.

Exec () kullanırken dikkatli olun

Bir durumu düşünün, bir Unix sistemi (macOS, Linux vb.) Kullanıyorsunuz ve osmodülü içe aktardınız. OS modülü, bir dosyayı okuma veya yazma gibi işletim sistemi işlevlerini kullanmanın taşınabilir bir yolunu sağlar.

Kullanıcıların kullanarak bir değer girmesine izin verirseniz, kullanıcı exec(input())dosyayı değiştirmek için komutlar verebilir ve hatta komutu kullanarak tüm dosyaları silebilir os.system('rm -rf *').

exec(input())Kodunuzda kullanıyorsanız , kullanıcının hangi değişkenleri ve yöntemleri kullanabileceğini kontrol etmek iyi bir fikirdir. Dir () yöntemini kullanarak hangi değişkenlerin ve yöntemlerin kullanılabilir olduğunu görebilirsiniz.

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

Çıktı

('Giriş', 'Dışarı', '_', '__', '___', '__builtin__', '__builtins__', '__name__', '_dh', '_i', '_i1', '_i2', ' _ih ',' _ii ',' _iii ',' _oh ',' _sh ',' acos ',' acosh ',' asin ',' asinh ',' atan ',' atan2 ',' atanh ',' ceil ' , 'kopyala', 'cos', 'cosh', 'derece', 'e', ​​'erf', 'erfc', 'çıkış', 'exp', 'expm1', 'fabs', 'faktoriyel', ' 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 ',' radyan ',' günah ',' sinh ' , 'sqrt', 'tan', 'tanh', 'trunc')

Exec () 'de Kullanılabilir Yöntemlerin ve Değişkenlerin Kullanımını Kısıtlama

Çoğu zaman, kullanılan tüm mevcut yöntemler ve değişkenler exec()gerekli olmayabilir veya hatta bir güvenlik açığı olabilir. exec()Yönteme isteğe bağlı globaller ve yerel parametreler (sözlükler) geçirerek bu değişkenlerin ve yöntemlerin kullanımını kısıtlayabilirsiniz .

1. Hem global hem de yerel parametreler atlandı

Her iki parametre de atlanırsa (önceki örneklerimizde olduğu gibi), tarafından yürütülmesi beklenen kod exec()mevcut kapsamda yürütülür. Aşağıdaki kodu kullanarak mevcut değişkenleri ve yöntemleri kontrol edebilirsiniz:

 exec ('yazdır (dir ())')

2. Küresel parametrenin aktarılması; yereller parametresi atlandı

Genel ve yerel parametreler (sözlükler) sırasıyla genel ve yerel değişkenler için kullanılır. Yereller sözlüğü atlanırsa, varsayılan olarak küresel sözlüğü kullanılır. Yani, globaller hem global hem de yerel değişkenler için kullanılacaktır.

Not: Sırasıyla globals () ve locals () yerleşik yöntemleri kullanarak Python'daki mevcut global ve yerel sözlüğü kontrol edebilirsiniz.

3. Boş sözlüğü globals parametresi olarak iletme

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

Eğer globaller olarak boş bir sözlük geçmesi, yalnızca __builtins__mevcuttur object(exec ilk parametre ()). Yukarıdaki programda matematik modülünü içe aktarmış olsak da, matematik modülü tarafından sağlanan işlevlerden herhangi birine erişmeye çalışmak bir istisna oluşturacaktır.

Çıktı

 ('__builtins__')

Belirli Yöntemleri Kullanılabilir Hale Getirme

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

Burada exec () tarafından çalıştırılan kod da sqrt()ve pow()ile birlikte yöntemlere sahip olabilir __builtins__.

Yöntemin ismini isteğinize göre değiştirmek mümkündür.

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

Yukarıdaki programda, squareRoot()karekökü hesaplar (benzer işlevsellik gibi sqrt()). Ancak kullanmaya çalışmak sqrt()bir istisna oluşturacaktır.

Yerleşik kullanımın kısıtlanması

Sen kullanımını kısıtlayabilir __builtins__değerini vererek Noneetmek '__builtins__'globaller sözlükte.

 exec (nesne, ('__builtins__': Yok)) 

4. Hem global hem de yerel sözlüğü iletme

Yereller sözlüğünü ileterek gerekli işlevleri ve değişkenleri kullanıma hazır hale getirebilirsiniz. Örneğin:

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

Çıktı

 ('dir', 'yazdır') 

Burada, yöntem tarafından yalnızca iki yerleşik yöntem print () ve dir () çalıştırılabilir exec().

Unutulmamalıdır ki, exec()kodu çalıştırır ve herhangi bir değer (döner None) döndürmez . Bu nedenle, işlev tanımlarının dışında return ve verim ifadelerini kullanamazsınız.

Ilginç makaleler...