Python - 从不是包的目录中导入模块

时间:2012-05-10 12:10:44

标签: python python-3.x

我有这样的目录结构......

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

for Python 3.x

请注意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()

2 个答案:

答案 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
  1. 将文件__init__.py 添加到dir1, dir2, dir3 ...
  2. 在包层次结构中,使用两个点

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

     

Importing modules from parent folder

     

How to import a Python class that is in a directory above?