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