2013-09-27 26 views
8

İçe aktarılan bir dosyadan nasıl bir işlevi çağırırsınız? örneğin:Python: İçe aktarılan dosyadan arama işlevi

Testi:

import test2 
def aFunction(): 
    print "hi there" 

Test2:

import test 
aFunction() 

Bu benim işlev tanımlanmamış söyleyerek, bana bir isim hatası verir. Ben de denedim:

from test import aFunction 

Ve:

from test import * 

Ben de testinde test2 ithal değil denedim. Ben C++ dan Python geliyorum, bu yüzden bir dairesel ithalat oluştururken ... Ben usta Python progammers için pervasızca belirgin bir şey eksik

+1

Sizin 'Test aktarma aFunction' çalışmış olmalıydı gelen, ne hata gördünüz? –

+3

Ayrıca, Python'da bulunan bir ['test' paketi] (http://docs.python.org/2/library/test.html) bulunduğunu ve bunun yerine * o * olduğunu bilebilirsiniz. –

+0

Daha büyük projemde aynı hatayı yaşıyordum, sadece sorunumu göstermek için test dosyalarını oluşturdum. "Alma Hatası: Ad 'aFunction' adı alınamadı" hatasını alıyorum. – RageCage

cevap

9

korkuyorlar. test.py, test.py ürününü içe aktarmaya çalışan test2.py içeri aktarır.

Bunu yapma. test2, test'u aldığında, bu modül tüm kodu yürütmeyi tamamlamamıştır; işlev henüz tanımlanmamıştır:

  • test

    derlenmiş ve yürütülür, ve boş modül nesnesi sys.modules ilave edilir.

  • hat import test2 çalıştırılır.

    • test2

      derlenmiş ve yürütülür, ve boş modül nesnesi sys.modules ilave edilir.

    • hat import test çalıştırılır.

      • testsys.modules bir modül olarak zaten mevcut olan, bu amaç döndü ve adı test bağlıdır.
    • Bir sonraki satır test.aFunction()'u çalıştırmayı dener. test'da böyle bir ad yok. Bir istisna ortaya çıkar. Bir istisna büyüdü çünkü def aFunction() tanımlayan

  • hatları, idam asla.

import test2 hattını çıkarın ve test2.py doğrudan çalıştırın ve fonksiyonunu ithal iyi çalışır:

import test 

test.aFunction() 
+0

+1 İthalatların nasıl çözüldüğü hakkında iyi bir açıklama. Dün konuştuğum bir kişi (ağır bir Java arkaplanı ile), gerçekten python'da çalışmanın yolu ile gerçekten şaşırdı. – Brian

+0

Bundan şüphelenmiştim. Gördüğünüz gibi, her iki şekilde de yaptığımı söyledim. – RageCage

+0

@BraydonKains Başka bir şey olmalıydı çünkü olduğu gibi, bu işler. – Brian

İlgili konular