2013-05-03 21 views
6

Yığın Taşması ile ilgili birkaç benzer soru gördüm, ancak sorunumu veya genel durumu ele almıyor gibi görünüyor. Yani, umarım bu soru bunu düzeltir ve baş ağrımı durdurur. (ZamanPython'daki Kardeş Alt dizinlerinden mi içe aktarılıyor?

repo/ 
    __init__.py 
    sub1/ 
     __init__.py 
     sub1a/ 
     __init.py 
     mod1.py 
    sub2/ 
     __init__.py 
     mod2.py 

Ben mod1.py ve tersi mod2.py aktarırım nasıl ve ne bu değişiklik mod1.py veya mod2.py komut olup olmamasına bağlı olarak kapsamaz: Ben formun bir git repo var her biri, içe aktarılıyor (içe aktarılmıyor)?

cevap

6

En basit çözüm, repo içeren dizini PYTHONPATH öğenize koymak ve sonra yalnızca mutlak yol içe aktarmalarını kullanmaktır, örn. import repo.sub2.mod2 vb.

Başka çözümü size keyfi dizinleri komut dosyaları gibi doğrudan piton dosyaları hem yürütmesini ediyoruz örneğini kapsar istiyorsanız bazı hackery dahil etmek için gidiyor - etkin bir PYTHONPATH ayarlamayla aynı işi başarmak için bozma büyük olasılıkla sys.path, ancak kullanıcı ayarlamaya gerek kalmadan. Özel bir nokta sözdizimi kullanılır nispi ithalat ile sizin PYTHONPATH

için repo ekleme

  • Bağıl ithalatı
  • :

+1

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

+1

İ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

2

Python 2.6+ kullanıyorsanız, iki seçeneğiniz vardır:

paket alt1:

paket sub1a içinde
from .sub2.mod2 import thing 

: Düz ithalat ifadeleri (import module) göreli ithalat ile çalışmadığını

from ..sub2.mod2 import otherthing 

Not.

export PYTHONPATH=/where/your/project/is:$PYTHONPATH 

diğer bilgiler:

+0

Gerçekten bu göreceli ithalatların çalışmasını istedim. Ancak, benim python 2.7 üzerinde, çalışmıyorlar. –

+0

Python 2.7'yi kullanarak, sub2.mod2 içe aktarma nesnesinden 'gibi ifadeler kullanarak başarı elde ettim. – coralvanda

0

Bir komut dosyası veya modül ya

    sistem yolunda
  1. veya ithal komut/modül olarak aynı paketin
  2. 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.

İlgili konular