Bir komut dosyası veya modül ya
sistem yolunda
- veya ithal komut/modül olarak aynı paketin
- bölümünü olan modüller alabilirsiniz.
Modüller için bu kurallar istisnasız uygulanır. Komut dosyaları için kurallar geçerlidir, ancak kırışıklık, bir betik çalıştırdığınızda varsayılan olarak, bir paketin parçası olarak kabul edilmez.
Bu, varsayılan olarak komut dosyasının yalnızca sistem yolunda bulunan modülleri içe aktabileceği anlamına gelir. Varsayılan olarak, yol geçerli dizini içerir, böylece bir komut dosyasını çalıştırırsanız, aynı dizindeki modülleri veya alt dizinler olan paketleri içe aktarabilir. Ama bu kadar. Bir betik, dizin ağacında "olduğu yerde" bulunmaz. Bu nedenle, dizinleri kapatma hakkında belirli göreli yol bilgisi gerektiren herhangi bir içe aktarma yapamaz. Bu, "ana dizinden" veya "bir kardeş dizinden" bir şeyleri içe aktaramayacağınız anlamına gelir. Bu dizinlerde bulunan şeyler yalnızca sistem yolunda olduğunda içe aktarılabilir.
Paket içinde "biliyorum" bir betik yapmak istiyorsanız, __package__
özniteliği verebilirsiniz. this previous question'a bakın. Daha sonra söz konusu betikten normal olarak göreceli olarak açık ithalatlar (ör. from ...sub2 import mod2
) kullanabilirsiniz.
PYTHONPATH'ı düzenleme konusunda iyiyim, ancak bunu uygulamak için standart bir yol var mı? Repo'nun tüm yeni kullanıcılarının PYTHONPATH'ını manuel olarak girip güncellemelerini istemiyorum. – Eli
İnsanların PYTHONPATH'ı kendileri yönetmek zorunda kalmasını istemiyorsanız, sys.path 'mangling'i düşünmeniz gerekebilir. (Örneğin, betiğin bulunduğu yere bakmak için '__file__' artı' os.abspath' işlevini kullanın, ardından dizinin repo'nun üst öğesi olması için doğru düzeydeki dizini alın ve sonra sys.path.insert – Amber