我有这样的目录结构......
dir/
build.py
dir2
dir3/
packages.py
现在build.py
需要packages.py
- 并注意dir2
不是包。
那么将packages.py
加载到build.py
的最佳方式是什么(目录结构无法更改)
修改
sys.path.append
解决方案似乎很好 - 但有一点 - 我需要很少使用packages.py
文件 - 并保留包含所用目录的sys.path
很少,但是在最前面 - 这是最好的事情吗?
编辑II
我认为imp
解决方案最好。
import imp
packages = imp.load_source('packages', '/path/to/packages.py')
编辑III
请注意imp.load_source
和其他一些功能have been deprecated。所以你今天应该使用imp.load_module
。
fp, pathname, description = imp.find_module('packages', '/path/to/packages.py')
try:
mod = imp.load_module('packages', fp, pathname, description)
finally:
# since we may exit via an exception, close fp explicitly
if fp:
fp.close()
答案 0 :(得分:5)
你可以这样做:
sys.path.append('./dir2/dir3')
import packages
或者更好:
sys.path.append(os.path.join(os.path.dirname(__file__), 'dir2/dir3'))
import packages
或(取自此处:How to import a module given the full path?)
import imp
packages = imp.load_source('packages', '/path/to/packages.py')
答案 1 :(得分:1)
“正确的方法”会成为第三条吗? -避免直接与sys.path
我遇到了同样的问题,我解决了。
dir/
build.py
dir2
dir3/
packages.py
__init__.py
添加到dir1, dir2, dir3 ...
bulid.py
要导入packages.py
,写在bulid.py中:
import ..dir2.dir3.packages
from ..dir2.dir3.packages import function
https://docs.python.org/2/whatsnew/2.5.html#pep-328-absolute-and-relative-imports