如何根據相對路徑導入Python模塊? html
例如,若是dirFoo
包含Foo.py
和dirBar
,而且dirBar
包含Bar.py
,如何將Bar.py
導入Foo.py
? python
這是一個直觀的表示: linux
dirFoo\ Foo.py dirBar\ Bar.py
Foo
但願包含Bar
,但重組文件夾層次結構不是一種選擇。 shell
若是您只是在修補而且不關心部署問題,則能夠使用符號連接(假設您的文件系統支持它)使模塊或包直接在請求模塊的文件夾中可見。 ubuntu
ln -s (path)/module_name.py
要麼 app
ln -s (path)/package_name
注意:「模塊」是任何擴展名爲.py的文件,「package」是包含文件__init__.py
(能夠是空文件)的任何文件夾。 從使用的角度來看,模塊和包是相同的 - 都經過import
命令公開它們包含的「定義和語句」。 python2.7
請參閱: http : //docs.python.org/2/tutorial/modules.html spa
不對腳本進行任何修改的最簡單方法是設置PYTHONPATH環境變量。 由於sys.path是從這些位置初始化的: code
趕忙跑: htm
export PYTHONPATH=/absolute/path/to/your/module
您的sys.path將包含上面的路徑,以下所示:
print sys.path ['', '/absolute/path/to/your/module', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']
添加__init__.py文件:
dirFoo\ Foo.py dirBar\ __init__.py Bar.py
而後將此代碼添加到Foo.py的開頭:
import sys sys.path.append('dirBar') import Bar
相對sys.path示例:
# /lib/my_module.py # /src/test.py if __name__ == '__main__' and __package__ is None: sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) import my_module
基於這個答案。
對於這種狀況,將Bar.py導入Foo.py,首先我將這些文件夾轉換爲Python包,以下所示:
dirFoo\ __init__.py Foo.py dirBar\ __init__.py Bar.py
而後我會在Foo.py中這樣作:
from .dirBar import Bar
若是我但願命名空間看起來像Bar。 不管如何 ,或
from . import dirBar
若是我想要命名空間dirBar.Bar。 不管如何 若是dirBar包下有更多模塊,則第二種狀況頗有用。