我这里有一个python模块/root/python/foo.py
。我在文件夹/root/lib/
中有一堆其他模块,看起来像这样
lib/
|
├─ module1/
| ├─ __init__.py
| └─ bar.py
|
└─ module2/
├─ __init__.py
└─ bar.py
我想从/root/lib/module1
导入/root/lib/module2
和foo.py
。我想不必须将/root/lib/
添加到python系统路径。 This stack overflow answer告诉您如何使用imp.load_source
,importlib.machinery.SourceFileLoader
或importlib.util
类从文件加载模块(取决于python版本)。我认为这些只有在模块是单个文件时才有效。如果我在Python 3.4中尝试这样的东西
from importlib.machinery import SourceFileLoader
problem_module = SourceFileLoader('test_mod', '/root/lib/module1').load_module()
我得到IsADirectoryError
我的问题是,如果它是一个目录,是否有类似的方法加载模块(给定其完整路径),而不将整个lib/
文件夹添加到系统路径?
答案 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
无法引用的文件,大多数通常的解决方案都会执行以下操作之一:
sys.path
或sys.path
几乎所有其他没有做到的解决方案都是解决方法(使用非预期的方法来完成工作),有些可能会引起很大的麻烦。
然而,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
不变的。