SORU
3 Ocak 2013, PERŞEMBE


Python göreli milyarıncı kez ithalat

Buraya geldiğimden

ve kopya olmadığını URL bol, biraz üzerinde YANİ diğer siteler biraz üzerinde düşündüğümde geri Çözüm çabuk olurdu.

Windows 7, 32-bit 2.7.3, nasıl bu "non-paket göreli ithalat" mesaj? Teşebbüs çözerim Python İle sonsuza kadar yinelenen soru ise şu: Kep-0328 paketi tam bir kopyasını inşa ettim:

package/

    __init__.py

    subpackage1/

        __init__.py

        moduleX.py

        moduleY.py

    subpackage2/

        __init__.py

        moduleZ.py

    moduleA.py

Fonksiyonları uygun modülleri kavurmalı yumurta adında yaptım. Doğal olarak işe yaramadı. Cevap görünüşe göre Ben listede 4. URL, ama benim için tüm mezunlar. Ben ziyaret edilen URL birinde bu yanıtı vardı:

Göreli ithalat modülü adı özniteliği paketi hiyerarşisinde Bu modül konumunu belirlemek için kullanın. Eğer modülün adı içermiyor herhangi bir paket bilgileri (örneğin seti 'ana') göreli ithalat çözülmüş gibi modül bir üst düzey modülü bakılmaksızın modülü aslında yer alan dosya sistemi.

Yukarıdaki yanıt umut verici görünüyor, ama bana tüm hiyeroglifleri. Sorum şu ki, nasıl Python benim için dönüş yapabilirim "sigara paketi içinde göreli ithalat Teşebbüs mü? -m, güya ile ilgili bir cevap vardır.

Biri Python hata mesajı veriyor, neden bana söyleyebilirtarafından ne Demek-paket sigara!neden ve nasıl tanımlıyorsunuz 'paket', vekesin cevap açısından bir kindergartener anlamak için yeterince kolay koymak. Şimdiden teşekkürler!

Edit: ithalat konsoldan yapıldı.

CEVAP
3 Ocak 2013, PERŞEMBE


Burada bir açıklama. Kısa versiyonu doğrudan bir Python dosyasını çalıştırma ve başka bir yerden dosya alma arasında büyük bir fark vardır.Sadece bir dosya içinde ne olduğunu bilmeden Python paketi olduğunu düşündüğü şeyi belirlemez.Bu, ayrıca, dosya yüklenemedi Python nasıl (ithal ederek çalıştırarak ya) bağlıdır.

Üst düzey komut, ya da bir Python dosyasını yüklemek için iki yol vardır: modül. Bir dosya ise doğrudan yürütme üst düzey komut dosyası olarak yüklenmiş komut satırında python myfile.py yazarak mesela. python -m myfile, yaparsan ya da eğer yüklü ise import deyimi başka bir dosya içinde encounted bir modül olarak yüklenir. Sadece bir tane üst düzey bir zamanda script olabilir; üst düzey komut başlangıç için koşup Python dosyası.

Bir dosya yüklendiğinde, bir ad ** 5 özniteliği (saklanan) verilir. Eğer üst düzey komut dosyası yüklendi, adını __main__. Eğer bir modülü yüklendi, adını dosya adı olan bir parçasıdır alt paketleri/paketler adlarını öncesinde, nokta ile ayrılmış.

moduleX ithal örneğini, (not: . mesela yani ^em>ithaldoğrudan idam değil), onun adı package.subpackage1.moduleX olurdu. Eğer moduleA, aldıysanız onun adı package.moduleA olurdu. Ancak, eğerdoğrudan çalıştırınKomut satırından moduleX, adını 12*, *olacak yerine ve eğer doğrudan komut satırından moduleA run, adını __main__ olacak. Bir modül üst düzey komut dosyası çalıştırdığınızda, normal adını kaybeder ve onun adı __main__ yerine.

Ek bir ipucu var: modül adı "" bu dizin veya bir paket üzerinden ithal. ithal olup olmadığını bağlıdır Eğer dizinde Python çalıştırırsanız sadece bir fark yapar, ve aynı dizinde bir dosya (veya bir alt dizin) almayı deneyin. Örneğin, eğer başlangıç Python yorumlayıcısı dizin package/subpackage1 ve import moduleX adı moduleX sadece moduleX package.subpackage1.moduleX. Çünkü Python ekler geçerli dizini arama yolunda başlangıç; eğer bulduğu için--ithal modülünde geçerli dizini, biliyoruz ki bu dizinin bir parçası olduğu paket ve paket bilgileri olmaz parçası haline modülün adı.

Özel bir durum varsa yorumlayıcı etkileşimli olarak (örneğin, sadece yazın python ve anında Python kodunu girmeye başlayın) çalıştırırsanız. Bu durumda etkileşimli oturum adı __main__.

Şimdi burada hata iletisi için önemli bir şeyeğer bir modül adı nokta varsa, bir paketin bir parçası olarak kabul edilir. Bu dosya aslında disk üzerinde nerede olduğunun önemi yok. Önemli olan onun adı ne, adını sen dolu nasıl bağlıdır.

Şimdi eğer söz konusu dahil alıntı bak:

Göreli ithalat modülü adı özniteliği paketi hiyerarşisinde Bu modül konumunu belirlemek için kullanın. Eğer modülün adı içermiyor herhangi bir paket bilgileri (örneğin seti 'ana') göreli ithalat çözülmüş gibi modül bir üst düzey modülü bakılmaksızın modülü aslında yer alan dosya sistemi.

Göreli ithalat modülünü kullanınadıbir paketin nerede olduğunu belirlemek için. from .. import foo gibi göreceli bir ithalat kullandığınızda noktalar paketi hiyerarşisinde seviyeleri birkaç adım gösteriyor. Eğer geçerli modül adı ise, örneğin package.subpackage1.moduleX ..moduleA package.moduleA anlamına gelir. Çalışmak from .. import için, modül adı import deyim vardır en azından pek çok nokta var.

Eğer modülün adı ise __main__, bir paket olarak kabul edilir. Adını hiçbir nokta vardır, ve bu nedenle içinde from .. import ifadeleri kullanamazsınız. Eğer bunu yapmaya çalışırsanız, "sigara paketi içinde göreli alma" hata. alacak

Muhtemelen ne yaptığını moduleX veya benzeri çalıştırmak için komut satırından çalıştın. Bunu yaparken, adını içinde göreli ithalat adını bir paket olduğunu ortaya koymuyor çünkü başarısız, anlamına gelir __main__, ayarlandı. Bu da olursa çalıştırdığınız Python ile aynı dizinde bir modül, ve sonra denemek için alma Bu modül, çünkü, yukarıda açıklandığı gibi, Python bulacaksınız modülünde geçerli dizini "çok erken" olmadan hayata parçası olan bir paket.

"Adı" etkileşimli oturum her zaman __main__. etkileşimli yorumlayıcı çalıştırdığınızda da unutmayın Böylecedoğrudan etkileşimli bir oturumu ithalat göreceli. Göreli ithalat sadece modül dosyaları içinde kullanım içindir.

Bu iki çözümü vardır. Gerçekten moduleX doğrudan çalıştırmak ister, ama sen yine de bir paketi bir parçası olarak kabul etmek istiyorsanız, python -m package.subpackage.moduleX yapabilirsiniz. -m üst düzey komut dosyası bir modül yüklemek için Python söyler.

Ya da belki de gerçekten istemiyorsunçalıştırın37**, sadece başka bir komut dosyası çalıştırmak istiyor, ki myfile.pykullanırmoduleX içindeki fonksiyonlar. Eğer durum buysa, myfile.py koybaşka bir yere---değilpackage dizin ve çalıştırmak içinde. Eğer myfile.py içinde from package.moduleA import spam gibi şeyler yaparsanız iyi çalışır.

Bu çözümler de, paketi dizin (package örnek) Python modül arama yolunu (sys.path) erişilebilir olması gerekir. Eğer değilse, paketin içinde bir şey güvenilir bir şekilde kullanmak mümkün olmayacaktır.

2.6 modülü "paket çözüm amaçlı değil sadece __package__ __name__ nitelikleri tarafından belirlenir" özniteliği. adı Python beri (teknik bir not: Açık sembolü __name__ modülün ifade etmek için kullanarak kaçıyorum o yüzden"". name Python 2.6 beri bir modül __package__*.* 52) ise "etkili __package__ '.' __name__ veya __name__ sadece" adı

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Howard Pinsky

    Howard Pinsk

    6 AĞUSTOS 2006
  • How Things Are Made

    How Things A

    17 HAZİRAN 2008
  • Attempts at least

    Attempts at

    1 Ocak 2007