2012-07-28 12 views
8

Yüklü bir modülle, içe aktarılan bir modül arasındaki farkı anlamaya çalışıyorum.Python sys.modules, henüz alınmayan bir modül içeriyor

Python 2.7.3'te çalışıyorum ve Python'u komut satırından çalıştırıyorum.

Ben çalıştırırsak:

import sys 
sys.modules 

Ben örneğin os içeren bir liste olsun. Belgeler, sys.modules'un "yüklü" modüllerin bir listesi olduğunu söylüyor. Ancak, os.environ gibi bir şeyi çalıştırmaya çalışırsam, os'un tanımlı olmadığını bildiren bir NameError alıyorum. Ancak, import os çalıştırırsam, bu sorunu giderir. Modülü gerçekten almadan önce neden os'un neden sys.modules modelinde var olduğunu açıklayabilir misiniz?

+0

Yepyeni bir kabuk açın ve adımları izleyin. Açıklamaları veya daha iyisi, ekran görüntüleri. Modül os sys içinde bulunmuyor –

cevap

9

İçe aktarılan ve yüklenmekte olan bir modül arasındaki fark, mevcut modülün ad alanına yerleştirilen değerdir. Bir modül sadece bir kez (normal durumlarda) yüklenir, ancak birçok farklı yerden birçok kez içe aktarılabilir. Yüklü bir modül, oraya aktarılmadıysa, belirli bir ad alanında erişilebilir olmayabilir. Örneğin, from module import name sözdizimini kullanarak kendi adı altında içe aktarmadan bir modül yükleyebilirsiniz (belirtilen adla erişebilirsiniz, ancak modülün kendisi değil).

Bunu piton yorumlayıcısı tarafından dahili olarak kullanıldığından sys.modules sözlükte os modülünü görüyoruz ve bu nedenle her zaman başlangıçta yüklenir. Buna, ad alanınıza otomatik olarak içe aktarılmadığı için "os" adını kullanarak erişemezsiniz. Bununla birlikte, normal içe aktarma mekanizmalarını birkaç şekilde atlayabilirsiniz. Örneğin, bu deneyin:

import sys 
os = sys.modules["os"] 

Artık import os yapmıştı sadece sanki os modülünü erişmek mümkün olacak.

Çünkü bu kod, zaten yüklenmiş olan bir modül isteğinde bulunduğunuzda bir import deyiminin tam olarak ne yaptığıdır. Ancak, yukarıdaki kodu henüz yüklenmemiş bir modülle denerseniz, işe yaramaz (sys.modules sözlüğünden bir anahtar hatası alırsınız). import bildirimi, geçerli ad alanına eklenmesinin yanı sıra yeni modülleri yükler. Modülleri manuel olarak yükleyebilmeniz ve normal içe aktarma sistemi çevresinde daha fazla çalışabilmenize rağmen, bunu yapmak için nadiren iyi bir neden vardır.

+0

Teşekkürler, bu çok yardımcı oldu! – Justin

İlgili konular