如何在给定完整路径的情况下导入模块?

2022-09-05 00:53:42

如何加载给定完整路径的Python模块?

请注意,该文件可以位于文件系统中的任何位置。


答案 1

对于 Python 3.5+ 使用 (docs):

import importlib.util
import sys
spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
sys.modules["module.name"] = foo
spec.loader.exec_module(foo)
foo.MyClass()

对于 Python 3.3 和 3.4,请使用:

from importlib.machinery import SourceFileLoader

foo = SourceFileLoader("module.name", "/path/to/file.py").load_module()
foo.MyClass()

(尽管这在Python 3.4中已被弃用。

对于 Python 2,请使用:

import imp

foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()

对于已编译的Python文件和DLL,有等效的便利函数。

另请参见 http://bugs.python.org/issue21436


答案 2

向 sys.path 添加路径(与使用 imp 相比)的优点是,当从单个包导入多个模块时,它可以简化操作。例如:

import sys
# the mock-0.3.1 dir contains testcase.py, testutils.py & mock.py
sys.path.append('/foo/bar/mock-0.3.1')

from testcase import TestCase
from testutils import RunTests
from mock import Mock, sentinel, patch