2009-12-28 199 views
1

的代碼:爲什麼我的代碼打印`os.path`

def a(x): 
    if x=='s': 
     __import__('os') #I think __import__ == import 
     print os.path 

爲什麼不print a('os')打印os.path中?


我的下一個問題是:爲什麼下面的代碼使用__import__('some'),而不是像,a = __import__('os')

def import_module(name, package=None): 
    if name.startswith('.'): 
     if not package: 
      raise TypeError("relative imports require the 'package' argument") 
     level = 0 
     for character in name: 
      if character != '.': 
       break 
      level += 1 
     name = _resolve_name(name[level:], package, level) 
    __import__(name)   #Why does it do this 
    return sys.modules[name] #Instead of `return __import__(name)` 
+1

爲什麼你想在所有使用__ __進口相當於

__import__('foo.bar') return sys.modules['foo'] 

? –

+1

在文件頂部使用「import os」有什麼問題嗎? – Pod

回答

5

@ statictype.org的答案是正確的(__import__不綁定本地命名空間中的任何名稱),但爲什麼您要打印<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.pyc'>或什麼東西同樣奇怪取決於您的平臺?這是什麼print os.path將做一旦你已經修復你的bug - 什麼你試圖完成由?!

你確定你不想要完全不同的東西,如print os.environ['PATH']print os.getcwd() ...?

編輯:回答OP的後續問題:

__import__(name)#why it do this 
return sys.modules[name] 

__import__沒有安裝什麼是進口的sys.modules;這總比

return __import__(name) 

如果name包含一個或多個. S(點):在這種情況下,__import__返回頂級模塊,但sys.modules有真實的東西。例如:

return __import__('foo.bar') 

因爲人們可能認爲

__import__('foo.bar') 
return sys.modules['foo.bar'] 
+0

嗨亞歷克斯,我已經更新了示例,請幫我看看 – zjm1126

+0

因此,'__ import__'必須是不同的名稱,因爲'__import__'無法區分'a.txt','a.py'或'a.rar',是的,謝謝 – zjm1126

+0

'__import__'導入Python模塊,所以'.py'(或者'.pyd' [[在Win上運行;'.so在Linux上]],或者直接使用'.pyc',如果存在和更新的話,**不會** .txt或.rar。 –

11

__import__返回一個模塊。它實際上並沒有向當前名稱空間添加任何內容。

你可能想只使用import os

def a(x): 
    if x=='s': 
     import os 
     print os.path 
a('s') 

另外,如果你想導入的模塊作爲一個字符串,可以明確地賦值:

def a(x): 
    if x=='s': 
     os = __import__('os') 
     print os.path 
a('s') 
+0

hi @ statictype.org,我已經更新了示例,請幫我看看 – zjm1126