从相对路径导入模块

如何根据相对路径导入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包下有更多模块,则第二种状况颇有用。

相关文章
相关标签/搜索