2014-05-25 86 views
0

下列哪個Python 2.7導入場景是正確的?也就是說,如果我有一個名稱映射stdlib模塊的模塊,應該導入stdlib或本地版本?OSX上的Python絕對導入

在Linux

$ ls 
__init__.py time.py 

~/tmp $ cat time.py 
def a(): 
    print(¨a¨) 

~/tmp $ python 
Python 2.7.4 (default, Sep 26 2013, 03:20:26) 
[GCC 4.7.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import time 
>>> dir(time) 
['__doc__', '__name__', '__package__', 'accept2dyear', 'altzone', 'asctime',  'clock', 'ctime', 'daylight', 'gmtime', 'localtime', 'mktime', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname', 'tzset'] 

和OSX

sdk$ ls 
__init__.py time.py  time.pyc 

$ cat time.py 
def a(): 
    print("a") 

$ python 
Python 2.7.6 (default, Apr 9 2014, 11:48:52) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.38)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import time 
>>> dir(time) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'a'] 

PS:WINDOWS似乎遵循Linux和從__future__ import absolute_import使用沒有任何影響

+0

你確定兩個操作系統都有你的模塊包含在python路徑中嗎? – jonrsharpe

+0

你在第一個例子中是不是cd到'〜/ tmp'?那裏有一個'__init __。py'嗎? – juanchopanza

+0

你爲什麼使用同名模塊? –

回答

1

您當前的路徑通常會在被追加名單的第一位sys.path。這意味着您將始終導入您的自定義模塊。

如果你不想那樣,那麼你可以嘗試在python -E模式下啓動解釋器。這不會添加當前路徑sys.path,並且您將加載您的默認模塊。

另一種方式來導入全局模塊做一些黑客

import os 

temp_path = os.getcwd() 
os.chdir('/some/other/path') 

import myshadowingmodule 
os.chdir(temp_path) 

這使得它看起來你是在不同的目錄導入,並導入後,帶你回到你在哪裏

還有2個功能__import__importlib.import_module - 如果您想知道,您不能使用它們導入陰影模塊。