最近,我在 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)