最近,我在 ubuntu 下跑神经网络,用了conda 虚拟环境,但是不知为何,import 时却并不是我的虚拟环境中的包!!!
纳尼,开什么国际玩笑,anaconda 那么强,怎么会存在这个问题呢?
然后我在网上找各种教程,并没有解决我的问题。不得已,只好从 python 载入包的机制入手看一下了。
我的问题是:当我 import 的时候,总是载入了一个
/home/username/.local/lib/python*...
这个路径下的 package,但是我想载入的是/home/USERNAME/anaconda*/envs/VIRTUALE_NVIRONMENT/LIB *
1、sys.path 相关(未解决)
首先,我在网上找各种教程,基本上说的都是 python import package 的时候,会按照 sys.path 这个 list 依次寻找。然后,果断尝试啊。
第一次尝试,没解决问题:
import sys
print('original sys_path: ', sys.path)
sys.path.remove('[这个填入你想要移除的path的绝对路径(我移除的是上文中的 `/home/username/.local/lib/python*...`)]')
print('edit sys_path: ', sys.path)
删除后,列表中确实没有了那个烦人的路径。看起来有希望哦,赶紧跑一下程序。。。
气死!!!怎么回事儿啊,小老弟。。。怎么还是载入的 /home/username/.local/lib/python*...
我不服,说好的按照 sys.path
这个 list 顺序载入呢?
2、更改 ~/.bashrc
中的 PYTHONPATH
(未解决)
忽然想起来 PYTHONPATH 也是 Ubuntu 规定 python 寻找路径的配置。那说干就干,在 ~/.bashrc
种添加
# 建议添加到末尾试一下,因为这个很可能会损坏你的系统路径,这里仅仅为了演示效果。记得删除哦,因为这个也不起作用。
# 如果原来没有的话,注意删除,注意删除,注意删除!
# 有一定几率影响系统
export PYTHONPATH=""
添加完后,一看,现在的 sys.path
清净了很多,只剩我的虚拟环境的路径了。。。好开心,应该是可以了吧。
赶紧一试,失败如期而至,并不像我想的那样。
这两种方法也是网上讲的最多的方法,但是都不起作用。
3、关键问题,核心所在。(解决)
参考文献 全局的 site-package 目录是在 sys.path 中,可以通过以下方式查看。
(virtulaenvironment) D:\Anaconda3\workspace>python -m site
sys.path = [
... # 这里列出来一系列的 package
]
USER_BASE: '...' (exists)
USER_SITE: '.' (exists)
ENABLE_USER_SITE: True
# 或者另一种更加简洁的方式:
python -c "import site; print(site.getsitepackages())"
哇啊。。。要哭出来感觉,这就是我要找的啊。哈哈,怎么办,更改一下呗。
用户设置的本地的 packages 是
python -m site --user-site
小技巧:
<package>.__path__
识别特定包的位置
python -c "import setuptools as _; print(_.__path__)"
<module>.__file__
识别特定模块的位置
python3 -c "import os as _; print(_.__file__)"
pip show <package>
显示debian风格的包装信息:
pip show numpy
后记:
Python 的 import 流程由 imp 模块 控制,因此我们可以完全自己手动控制库的 import 过程。
使用 imp.find_module 来寻找模块:
import imp
imp.find_module('numpy') # 查看这个路径,就是你的包的来源
当然,我们可以使用 imp.load_source 直接 import 某个包文件并指定其包名。
imp.load_source('module_name', 'module_full_path')
print(module_name)