为特定方法从另一个安装目录导入包
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 的想法,但我通常建议不要依赖它。缓存在那里是有充分理由的,您应该相应地命名您的模块,这样您就不会 运行 因在多个位置使用相同的模块名称而引起冲突。
我想 运行 一个 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 的想法,但我通常建议不要依赖它。缓存在那里是有充分理由的,您应该相应地命名您的模块,这样您就不会 运行 因在多个位置使用相同的模块名称而引起冲突。