2011-02-01 84 views
3

我有兩個Python 2.6的文件,/code/x/X.py爲什麼這種絕對導入在Python中不起作用?

import imp 
print 'running' 
logging = imp.load_source('logging', '/code/y/logging.py') 

...和/code/y/logging.py

運行X.py打印:

running 
['/code/x', '/usr/lib/pymodules/python2.6', '/usr/lib/pymodules/python2.6/gtk-2.0', '/usr/lib/python2.6', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/python2.6/dist-packages/gst-0.10', '/usr/lib/python2.6/dist-packages/gtk-2.0', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/plat-linux2', '/usr/local/lib/python2.6/dist-packages'] 
/code/x 
<module 'logging' from '/code/y/logging.py'> 

爲什麼沒有from __future__ import absolute_import強制將import logging導入爲絕對導入,而不是本地導入?換句話說,爲什麼我沒有看到系統日誌記錄模塊?

回答

3

問題原來是imp.load_source命令。第一個參數是它在模塊下注冊的名稱,隨後的導入將首先在加載的模塊中查找,然後再查看路徑。更改線路使用不同的名稱,如:

logging = imp.load_source('logx', '/code/y/logging.py') 

...解決了問題。

+0

你的問題實際上解決了我的解決方案...如果這是有道理的。當不使用`imp.load_source`時,我經常遇到同樣的問題。即使您導入`absolute_import`,它仍然會在系統路徑之前查看腳本目錄。我通常通過彈出`sys.path [0]`來「解決」這個問題 - 但是當使用`imp.load_source`並將導入設置爲系統模塊名稱時,它仍然會被覆蓋。因此,使用`imp.load_source`而不是選擇系統模塊名稱是一個不錯的解決方案 - 比彈出`sys.path [0]`更好。那謝謝啦。 :) – edanfalls 2011-02-01 18:16:37

相關問題