Python - 导入给定完整​​路径的模块目录

时间:2016-07-17 18:39:27

标签: python

我这里有一个python模块/root/python/foo.py。我在文件夹/root/lib/中有一堆其他模块,看起来像这样


    lib/
    |
    ├─ module1/
    |  ├─ __init__.py
    |  └─ bar.py
    |
    └─ module2/
       ├─ __init__.py
       └─ bar.py

我想从/root/lib/module1导入/root/lib/module2foo.py。我想必须将/root/lib/添加到python系统路径。 This stack overflow answer告诉您如何使用imp.load_sourceimportlib.machinery.SourceFileLoaderimportlib.util类从文件加载模块(取决于python版本)。我认为这些只有在模块是单个文件时才有效。如果我在Python 3.4中尝试这样的东西

from importlib.machinery import SourceFileLoader
problem_module = SourceFileLoader('test_mod', '/root/lib/module1').load_module()

我得到IsADirectoryError

我的问题是,如果它是一个目录,是否有类似的方法加载模块(给定其完整路径),而不将整个lib/文件夹添加到系统路径?

2 个答案:

答案 0 :(得分:1)

<强>尝试:

from importlib.machinery import SourceFileLoader
problem_module = SourceFileLoader('test_mod', '/root/lib/module1/__init__.py').load_module()

__init__.py应该关注同一个包中的模块:

添加from . import bar以使bar.py成为程序包的一部分。

一些更正:

  • module1是一个包一个模块。
  • bar.py是包module1
  • 的模块部分

答案 1 :(得分:1)

Python没有为我们提供一种简单的方法来加载sys.path无法引用的文件,大多数通常的解决方案都会执行以下操作之一:

  1. 将所需路径添加到sys.path
  2. 重组您的模块,以便sys.path
  3. 上已有正确的路径

    几乎所有其他没有做到的解决方案都是解决方法(使用非预期的方法来完成工作),有些可能会引起很大的麻烦。

    然而,python确实为我们提供了一个机制,让我们可以模拟一个分布在__path__ = ["/root/lib"] 上没有的文件夹的包,你可以通过specifying a __path__ special name在模块中执行此操作:

    lib.py

    将此行放在名为foo.py的文件中,并将其放在与root/python/相同的文件夹中以便由其导入(在您的案例中为foo.py),然后从{{1你可以按照预期做到这一点:

    import lib.module1
    #or
    from lib import module1
    

    这向python表明.module1子包位于指定__path__的某个位置,并将使用预期的导入机制从该目录(或多个目录)加载并保留sys.path不变的。