Python hakkında tecrübeli değilim, bu yüzden kelimelerimde herhangi bir yanlışlık varsa, söyle. Dosya hiyerarşiniz şu şekilde düzenlenmişse:
project\
module_1.py
module_2.py
module_1.pyadında bir işlevi tanımlar func_1(), module_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
ve python module_2.pycmd'de koşarsanız, func_1()tanımlayanı yapar. Genellikle aynı hiyerarşi dosyalarını bu şekilde içe aktarırız. Eğer yazarken Ama from .module_1 import func_1içinde module_2.py, piton tercüman diyecekler No module named '__main__.module_1'; '__main__' is not a package. Bunu düzeltmek için, sadece yaptığımız değişikliği koruyoruz ve her iki modülü de bir pakete taşıyoruz ve çalışacak arayan olarak üçüncü bir modül yapıyoruz module_2.py.
project\
package_1\
module_1.py
module_2.py
main.py
main.py :
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
Ama biz eklemek nedeni .önce module_1de module_2.pybiz bu ve koşmak yapmazsak yani main.py, piton tercüman diyecekler No module named 'module_1', biraz zor olduğunu, module_1.pysağ yanında module_2.py. Şimdi izin func_1()de module_1.pydo şey:
def func_1():
print(__name__)
Bu __name__kayıtlar kim func_1 çağırır. Şimdi tutmak .önce module_1, koşmak main.py, bu yazdırır package_1.module_1değil module_1. O çağıran bir işaret func_1()ile aynı hiyerarşi olan main.py, .ima module_1ile aynı hiyerarşi olan module_2.pykendisi. Bir nokta yoksa, Yani main.pytanıyacak module_1kendisiyle aynı hiyerarşi de, bu tanıyabilir package_1, fakat ne "altında".
Şimdi biraz karmaşıklaştıralım. A config.inive modülünüz 'main.py' ile aynı hiyerarşide okumak için bir işlev tanımlar.
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Ve kaçınılmaz bir nedenden ötürü, onu aramak zorundasınız module_2.py, bu yüzden üst hiyerarşiden içe aktarmak zorunda. module_2.py :
import ..config
pass
İki nokta, üst hiyerarşiden içe aktarma anlamına gelir (üç nokta, üstten üste erişim vb.). Şimdi koşmak main.py, tercüman diyecekler: ValueError:attempted relative import beyond top-level package. Buradaki "üst düzey paket" dir main.py. Bunun config.pyyanında main.py, aynı hiyerarşide oldukları, config.py"altında" main.pyolmadığı veya "önderlik etmediği" main.pyiçin, ötesi de öyledir main.py. Bunu düzeltmek için en basit yol:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Bunun proje dosyası hiyerarşisini düzenleme ilkesine uyduğunu düşünüyorum, farklı klasörlerde farklı işlevlere sahip modüller ayarlamanız ve dışarıda en çok arayanı bırakmanız ve istediğiniz kadar içe aktarabilmeniz gerekir.