【问题标题】:Why does numpy import behave differently?为什么 numpy 导入的行为不同?
【发布时间】:2020-06-25 20:06:54
【问题描述】:

我使用以下命令在 Ubuntu 16.04 LTS 机器上的 python3 虚拟环境中安装 numpy。

我的目标是在我的 venv 中默认使用 python 3.5 并学习 numpy。我不应该明确使用python3。我觉得有一些重叠/错误,如果现在忽略,这可能是一个更大的问题。 另外,我的虚拟环境中没有安装 python 2.x,但我在系统级别安装了它。

命令python3 -V 和python -V 显示相同的版本并且都位于相同的路径。为什么最后一个命令有效,倒数第二个无效?

~/proj1$ virtualenv --no-site-packages -p python3 venv
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/$USER/proj1/venv/bin/python3
Also creating executable in /home/$USER/proj1/venv/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.
~/proj1$ source venv/bin/activate
(venv) ~/proj1$ which pip
/home/$USER/proj1/venv/bin/pip
(venv) ~/proj1$ pip -V
pip 20.0.2 from /home/$USER/proj1/venv/lib/python3.5/site-packages/pip (python 3.5)
(venv) ~/proj1$ pip install numpy
Collecting numpy
  Using cached numpy-1.18.1-cp35-cp35m-manylinux1_x86_64.whl (19.9 MB)
Installing collected packages: numpy
Successfully installed numpy-1.18.1
(venv) ~/proj1$ python -V
Python 3.5.2
(venv) ~/proj1$ python3 -V
Python 3.5.2
(venv) ~/proj1$ which python
/home/$USER/proj1/venv/bin/python
(venv) ~/proj1$ which python3
/home/$USER/proj1/venv/bin/python3
(venv) ~/proj1$ python -c "import numpy"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named 'numpy'
(venv) ~/proj1$ python3 -c "import numpy"
(venv) ~/proj1$ 

【问题讨论】:

  • 如果你运行/home/$USER/proj1/venv/bin/python -c "import numpy"会发生什么(确保你输入了python的完整路径)?
  • 另外,如果你运行“alias | grep -i python”(不带引号)会发生什么?
  • sys.path 在每种情况下是什么?
  • @jjramsey 使用完整路径运行 python 工作正常。像你提到的那样运行别名打印alias python='/usr/bin/python3'
  • 是您创建了python='/usr/bin/python3' 别名吗?

标签: python python-3.x numpy pip


【解决方案1】:

这个问题与numpy 本身无关。相反,发生的事情是别名python='/usr/bin/python3' 阻止您的shell 找到位于执行路径中的第一个python 可执行文件(即,具有“which python”给出的路径的可执行文件),这与您的虚拟环境混淆设置。因为那个别名,

python -c "import numpy"

被解释为

/usr/bin/python3 -c "import numpy"

由于您在虚拟环境中安装了numpy,因此/usr/bin 中的系统范围的Python 3 安装设计不知道numpy 的安装,所以你得到了@987654330 @。

另一方面,如果你要跑

unalias python
python -c "import numpy"

那么python 将被视为/home/$USER/proj1/venv/bin/python,当然前提是您已经采购了/home/$USER/proj1/venv/bin/activate,并且事情会如您所愿。

【讨论】:

  • 感谢您的回答!这是有道理的,这怎么可能是问题。我现在无法进入看到此错误的系统。我会尽快测试并发布结果。
  • 很抱歉这么晚才回复,但情况确实如此。谢谢@jjramsey!
【解决方案2】:

这里的寓意是“不要使用which”。 bash(现在几乎每个人都在使用)有一个内置命令type,它显示了如何解释命令;特别是,type -a python 将向您显示它将是您的虚拟环境的 python,但实际上是 别名 以运行来自 /usr/bin 的环境,即相同的版本,但没有安装相同的包(因为当然虚拟环境的目录不在其sys.path 上)。

【讨论】:

  • which 没有问题。这里真正的道德是不要使用别名来解决可执行路径。
  • @jjramsey: which 作为外部命令,永远无法提供真正准确的信息,这在诊断工具中对于此类情况是不可原谅的。有些版本甚至尝试通过grep 管道alias 来增加其PATH 搜索,这有点荒谬。当然,也必须谨慎和理解地使用别名。
猜你喜欢
  • 2019-12-25
  • 2019-07-14
  • 2013-01-12
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 2020-04-27
  • 2022-11-20
相关资源
最近更新 更多