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.py
adı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.py
cmd'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_1
iç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_1
de module_2.py
biz bu ve koşmak yapmazsak yani main.py
, piton tercüman diyecekler No module named 'module_1'
, biraz zor olduğunu, module_1.py
sağ yanında module_2.py
. Şimdi izin func_1()
de module_1.py
do ş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_1
değil module_1
. O çağıran bir işaret func_1()
ile aynı hiyerarşi olan main.py
, .
ima module_1
ile aynı hiyerarşi olan module_2.py
kendisi. Bir nokta yoksa, Yani main.py
tanıyacak module_1
kendisiyle aynı hiyerarşi de, bu tanıyabilir package_1
, fakat ne "altında".
Şimdi biraz karmaşıklaştıralım. A config.ini
ve 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.py
yanında main.py
, aynı hiyerarşide oldukları, config.py
"altında" main.py
olmadığı veya "önderlik etmediği" main.py
iç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.