如何使用imp导入具有相同绝对/相对路径的依赖项的模块?

时间:2012-01-30 16:01:19

标签: python import

有没有办法使用带有“imp”的绝对/相对路径在同一目录中导入具有依赖项的模块?

以下是目录结构:

.
├── importFrom
│   ├── dependant.py
│   └── dependence.py
└── test.py

文件test.py使用以下方法导入dependant.py:

modname=imp.load_source("testImp","importFrom/dependant.py")

反过来导入依赖.py直接用:

import dependence

调用test.py给出

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    modname=imp.load_source("testImp","importFrom/dependant.py")
  File "importFrom/dependant.py", line 1, in <module>
    import dependence
ImportError: No module named dependence

让load_source将加载模块的路径添加到加载器以便它自动找到其相对依赖关系可能是值得的。 现在,我发现的唯一替代方案是添加到系统路径,放入test.py

编辑:我找到了一种更好的方法来使用路径进行相对导入,添加文件以获取调用者的绝对路径(独立于当前工作目录)

sys.path.append(os.path.join(os.path.dirname(__file__), 'importFrom'))
import dependant

2 个答案:

答案 0 :(得分:0)

您需要__init__.py目录中的importFrom

In [5]: ls importFrom/
dependance.py  dependant.pyc  dependence.pyc  __init__.pyc
dependant.py   dependence.py  __init__.py

In [6]: from importFrom import dependant

In [7]: dependant.dependence
Out[7]: <module 'importFrom.dependence' from    'importFrom/dependence.py'>

我没有在dependant中导入test,而是使用Python解释器来显示输出。在dependant.py中,dependance已导入。

答案 1 :(得分:0)

IMO对load_source这是不可行的,它不会做必要的事情,所以你的'dependant.py'文件中的导入会考虑它的父目录。

您应该执行已建议的内容(目录中的__init__.py和模块中的绝对导入),或使用允许此类事情的较低级别的find_module / load_module函数(请参阅find_module'path'参数)