如何根据完整路径动态导入模块?
38 个回答
145
要导入你的模块,你需要把它所在的文件夹添加到环境变量中,这个操作可以是临时的,也可以是永久的。
临时添加
import sys
sys.path.append("/path/to/my/modules/")
import my_module
永久添加
在Linux系统中,你可以把下面这一行添加到你的 .bashrc
(或者其他类似的文件)中,然后在终端执行 source ~/.bashrc
(或者其他类似的命令)来使其生效:
export PYTHONPATH="${PYTHONPATH}:/path/to/my/modules/"
来源/致谢: saarrrr, 另一个Stack Exchange的问题
582
把路径添加到 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
1772
假设我们有一个叫做 MyClass
的类,它在 module.name
这个模块里,文件路径是 /path/to/file.py
。下面是如何从这个模块中导入 MyClass
的方法。
如果你使用的是 Python 3.5 及以上版本,可以这样做(参考文档):
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 文件,也有类似的方便函数。
你还可以查看 这个链接。