如何导入给定相对路径的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,但重组文件夹层次结构不是一个选项。
当前回答
嗯,正如您所提到的,通常您希望能够访问与主脚本运行位置相关的模块文件夹,因此只需导入它们。
解决方案:
我有D:/Books/MyBooks.py中的脚本和一些模块(如oldies.py)。我需要从子目录D:/Books/includes导入:
import sys,site
site.addsitedir(sys.path[0] + '\\includes')
print (sys.path) # Just verify it is there
import oldies
在oldies.py中放置一个打印(“done”),这样您就可以验证一切正常。这种方式总是有效的,因为根据程序启动时初始化的Python定义sys.path,此列表的第一项路径[0]是包含用于调用Python解释器的脚本的目录。
如果脚本目录不可用(例如,如果以交互方式调用解释器或从标准输入读取脚本),则路径[0]是空字符串,它指示Python首先搜索当前目录中的模块。请注意,脚本目录是在PYTHONPATH插入的条目之前插入的。
其他回答
您还可以将子目录添加到Python路径中,以便将其作为普通脚本导入。
import sys
sys.path.insert(0, <path to dirFoo>)
import Bar
嗯,正如您所提到的,通常您希望能够访问与主脚本运行位置相关的模块文件夹,因此只需导入它们。
解决方案:
我有D:/Books/MyBooks.py中的脚本和一些模块(如oldies.py)。我需要从子目录D:/Books/includes导入:
import sys,site
site.addsitedir(sys.path[0] + '\\includes')
print (sys.path) # Just verify it is there
import oldies
在oldies.py中放置一个打印(“done”),这样您就可以验证一切正常。这种方式总是有效的,因为根据程序启动时初始化的Python定义sys.path,此列表的第一项路径[0]是包含用于调用Python解释器的脚本的目录。
如果脚本目录不可用(例如,如果以交互方式调用解释器或从标准输入读取脚本),则路径[0]是空字符串,它指示Python首先搜索当前目录中的模块。请注意,脚本目录是在PYTHONPATH插入的条目之前插入的。
相对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
基于这个答案。
添加__init__.py文件:
dirFoo\
Foo.py
dirBar\
__init__.py
Bar.py
然后将以下代码添加到Foo.py的开头:
import sys
sys.path.append('dirBar')
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