如何导入给定相对路径的Python模块?
例如,如果dirFoo包含Foo.py和dirBar,而dirBar包含Bar.py,我如何将Bar.py导入Foo.py?
下面是一个视觉表示:
dirFoo\
Foo.py
dirBar\
Bar.py
Foo希望包含Bar,但重组文件夹层次结构不是一个选项。
如何导入给定相对路径的Python模块?
例如,如果dirFoo包含Foo.py和dirBar,而dirBar包含Bar.py,我如何将Bar.py导入Foo.py?
下面是一个视觉表示:
dirFoo\
Foo.py
dirBar\
Bar.py
Foo希望包含Bar,但重组文件夹层次结构不是一个选项。
当前回答
在本例中,要将Bar.py导入Foo.py,首先我会将这些文件夹转换为Python包,如下所示:
dirFoo\
__init__.py
Foo.py
dirBar\
__init__.py
Bar.py
然后我会在Foo.py中这样做:
from .dirBar import Bar
如果我希望名字空间看起来像Bar.whatever,或者
from . import dirBar
如果我想要名称空间dirBar.Bar.whatever。如果您在dirBar包下有更多模块,则第二种情况非常有用。
其他回答
您还可以将子目录添加到Python路径中,以便将其作为普通脚本导入。
import sys
sys.path.insert(0, <path to dirFoo>)
import Bar
Linux用户快速而肮脏的方式
如果您只是在修补,而不关心部署问题,则可以使用符号链接(假设您的文件系统支持该链接)使模块或包在请求模块的文件夹中直接可见。
ln -s (path)/module_name.py
or
ln -s (path)/package_name
注意:“模块”是扩展名为.py的任何文件,“包”是包含__init__.py文件(可以是空文件)的任何文件夹。从使用的角度来看,模块和包是相同的——都会根据import命令的请求公开其包含的“定义和语句”。
参见:http://docs.python.org/2/tutorial/modules.html
在本例中,要将Bar.py导入Foo.py,首先我会将这些文件夹转换为Python包,如下所示:
dirFoo\
__init__.py
Foo.py
dirBar\
__init__.py
Bar.py
然后我会在Foo.py中这样做:
from .dirBar import Bar
如果我希望名字空间看起来像Bar.whatever,或者
from . import dirBar
如果我想要名称空间dirBar.Bar.whatever。如果您在dirBar包下有更多模块,则第二种情况非常有用。
另一个解决方案是安装py-require包,然后在Foo.py中使用以下内容
import require
Bar = require('./dirBar/Bar')
如果您以这种方式构建项目:
src\
__init__.py
main.py
dirFoo\
__init__.py
Foo.py
dirBar\
__init__.py
Bar.py
然后,从Foo.py你应该能够做到:
import dirFoo.Foo
Or:
from dirFoo.Foo import FooObject
根据Tom的评论,这确实需要通过site_packages或搜索路径访问src文件夹。此外,正如他所提到的,__init__.py是在您第一次导入该包/目录中的模块时隐式导入的。通常__init__.py只是一个空文件。