为特定方法从另一个安装目录导入包

Import package from another installation directory for a particular method

我想 运行 一个 python 方法与另一个版本的 random_word 包。基本上,我安装了这个软件包的 2 个版本,一个在 '/home/arya/Documents/random-word' 中,另一个在 '/home/arya/myvenv/lib/python3.6/site-packages' 中。所以,为了尝试,我从这段代码开始。

import sys
print(sys.path)
import random_word
print(random_word.__file__)
del random_word
sys.path[-2],sys.path[-1] = sys.path[-1],sys.path[-2]
print(sys.path)
import random_word
print(random_word.__file__)

在运行宁,

(myvenv) arya@arya-HP-Notebook:~/Desktop$ python test.py 

它打印

sys.path :  ['', '/home/arya/myvenv/lib/python3.6/site-packages', '/home/arya/Documents/random-word']
location of random_word package:  /home/arya/myvenv/lib/python3.6/site-packages/random_word/__init__.py
sys.path :  ['', '/home/arya/Documents/random-word', '/home/arya/myvenv/lib/python3.6/site-packages']
location of random_word package:  /home/arya/myvenv/lib/python3.6/site-packages/random_word/__init__.py

我在 /home/arya/Documents/random-word 中安装了一个 random_word 包,另一个在我的 virtualenv 的 site-packages 目录中。

所以,我的疑问是,即使我更改了 sys.path 中目录的顺序,为什么我的 python 程序只找到 site-packages 中的 random_word

注意: 如果我在第一个 import random_word 语句之前更改顺序,那么 python 会选择安装在 /home/arya/Documents/random-word。我不明白为什么它对之前的案例不起作用。

谢谢。

基本上,您看到的是模块缓存。当您导入模块时,Python 将在内部缓存该模块,因此后续导入可以再次引用同一个模块实例。 Python 执行 this optimization 以防止必须再次重新编译模块。这也有效地使模块成为单例,因为它只能有一个实例。

通过调用 del random_word,您只是删除对该模块的引用,但不会卸载该模块。因此,当您稍后再次导入 random_word 模块时,Python 实际上不会再次查看导入路径的内部,而只会重用它已有的模块。

这就是为什么在 导入模块一次后更改路径顺序 不会有任何效果的原因。

有一些问题涉及 explicitly reloading already imported modules 的想法,但我通常建议不要依赖它。缓存在那里是有充分理由的,您应该相应地命名您的模块,这样您就不会 运行 因在多个位置使用相同的模块名称而引起冲突。