從相對路徑導入模塊

如何根據相對路徑導入Python模塊? html

例如,若是dirFoo包含Foo.pydirBar ,而且dirBar包含Bar.py ,如何將Bar.py導入Foo.pypython

這是一個直觀的表示: linux

dirFoo\
    Foo.py
    dirBar\
        Bar.py

Foo但願包含Bar ,但重組文件夾層次結構不是一種選擇。 shell


#1樓

Linux用戶的快捷方式

若是您只是在修補而且不關心部署問題,則能夠使用符號連接(假設您的文件系統支持它)使模塊或包直接在請求模塊的文件夾中可見。 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


#2樓

不對腳本進行任何修改的最簡單方法是設置PYTHONPATH環境變量。 由於sys.path是從這些位置初始化的: code

  1. 包含輸入腳本(或當前目錄)的目錄。
  2. PYTHONPATH(目錄名列表,語法與shell變量PATH相同)。
  3. 依賴於安裝的默認值。

趕忙跑: 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']

#3樓

添加__init__.py文件:

dirFoo\
    Foo.py
    dirBar\
        __init__.py
        Bar.py

而後將此代碼添加到Foo.py的開頭:

import sys
sys.path.append('dirBar')
import Bar

#4樓

相對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

基於這個答案。


#5樓

對於這種狀況,將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包下有更多模塊,則第二種狀況頗有用。

相關文章
相關標籤/搜索