Bir dizin altındaki tüm modülleri içeri aktarmanın almanın bir yolu var mı?
Şöyle bir klasör yapımız olsun:
/Foo
bar.py
spam.py
eggs.py
Bunun için muhtemelen importlib
kullanmak isteriz.
Önce Foo dizinini bir paket haline getirelim. Bunu yaparken__init__.py
adlı bir dosya tanımlıyoruz, __init__.py
dosyasının içerisinde ise aşağıdaki importları gerçekleştiriyoruz:
import bar
import eggs
import spam
Eğer bu işlemin dinamik olmasını istiyorsak (ki bu iyi bir fikir olabilir veya olmayabilir), list dir ile tüm py dosyalarını listeleriz ve bunları aşağıdaki gibi bir kod parçasıyla içe aktarırız:
import os
for module in os.listdir(os.path.dirname(__file__)):
if module == '__init__.py' or module[-3:] != '.py':
continue
__import__(module[:-3], locals(), globals())
del module
Ardından, kodunuzdan Foo’yu içeri aktarırız:
import Foo
Artık aşağıdaki modüllere ulaşabiliyoruz:
Foo.bar
Foo.eggs
Foo.spam
ve saire. isim çakışmaları ve kodu analiz etmeyi zorlaştırdığı için (ve başka çeşitli diğer nedenlerden dolayı) from Foo import *
şeklinde bir kullanım iyi bir fikir olmayacaktır.
__all__ değişkeni
Başka bir yöntem de __all__ değişkenini kullanmak olacaktır:
Geçerli klasördeki tüm python (.py) dosyalarını listeleyin ve bunları __init__.py
içinde __all__
değişkenine atayın.
from os.path import dirname, basename, isfile, join
import glob
modules = glob.glob(join(dirname(__file__), "*.py"))
__all__ = [ basename(f)[:-3] for f in modules if isfile(f) and not f.endswith('__init__.py'
Örnek
Detaylarla uğraşmayıp sadece işe yarayan bir kod arıyorsanız aşağıdakileri yapabilirsiniz:
foo adında bir klasör oluşturun ve bu klasör altına main.py
isimli bir dosya oluşturun. Dosya içeriği aşağıdaki gibi olsun:
from hellokitty import *
spam.spamfunc()
ham.hamfunc()
hellokitty
isimli bir klasör oluşturun:
Altına __init__.py
isimli bir dosya oluşturun ve aşağıdaki kodu yapıştırın:
__all__ = ["spam", "ham"]
hellokitty
altına spam.py
ve ham.py
isimli iki python dosyası oluşturun.
spam.py içinde bir işlev tanımlayın:
def spamfunc():
print("Spammity spam")
ham.py içinde de bir işlev tanımlayın:
def hamfunc():
print("Upgrade from baloney")
Çalıştırın:
el@apollo:/home/el/foo$ python main.py
spammity spam
Upgrade from baloney