如何明确告诉python安装命令使用哪个python ?



我在尝试使用安装在我的主目录中的本地版本的python/pip安装python模块时遇到了一堆问题。首先,这应该证明我的PATH变量设置正确:

command -v python
/home/myuserid/PYTHON4/bin/python
command -v python
/home/myuserid/PYTHON4/bin/pip

然后尝试使用pip安装python模块。部分模块安装成功。但是一个叫matlabplot的给我出了问题。具体来说,我运行

pip install matplotlib --target=/home/myuserid/PYTHON4/PYTHON

错误是

Complete output from command /usr/local/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-VwF2LG/subprocess32/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('rn', 'n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-pj2g8u-record/install-record.txt --single-version-externally-managed --compile --home=/tmp/tmplDhrIG:
....
gcc -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/usr/include/python2.7 -c _posixsubprocess.c -o build/temp.linux-x86_64-2.7/_posixsubprocess.o
_posixsubprocess.c:16:10: fatal error: Python.h: No such file or directory
#include "Python.h"

这个错误信息有两个问题:

  • 首先,它使用/usr/local/bin/python这是错误的python(我以前在那里安装了python)。这是从哪来的?它不在我的路上。如果我用printenv打印我的整个环境,它不会在任何地方列出。第二,gcc compile命令明确包含"-I/usr/include/python2.7"在命令行上。这应该不会发生,因为我试图使用安装在/p/home/myuserid/PYTHON4中的本地python。

我猜原因是我没有指定python的安装位置。我该如何解决这些问题?

避免pip install,选择python -m pip install。通过这种方式,您明确地告诉您想要使用您为其检查路径的python程序。你可以在它周围玩很多变化:

  • python3 -m pip install
  • /usr/bin/python3 -m pip install
  • python3.9 -m pip install

关于numpy问题,这是因为pip找不到已经为您的平台编译的numpy。这可能是因为您运行的是旧版本或pip,所以您可以先尝试python -m pip install --upgrade pip,然后再尝试安装numpy。

你也可以看看https://pypi.org/simple/numpy,你会看到一个文件列表,如:

numpy-1.21.2-cp38-cp38-win_amd64.whl
numpy-1.21.2-cp39-cp39-macosx_11_0_arm64.whl
numpy-1.21.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl

whl文件是预编译的文件,但对于特定的平台和特定的Python版本,这里我列出的3个轮子分别适用于numpy 2.21.2, cpython 3.9, windows, macosx和许多linux。

也许你的Python版本/numpy版本/平台没有在这里预编译?

如果你真的需要让pip编译numpy,你需要更多的依赖项,缺少Python.h意味着你的发行版中缺少python3-dev包。

最后一个提示:你应该使用venv:一个venv是由一个特定版本的Python创建的,所有的安装都是在venv中完成的(所以很容易删除:只要删除目录,以防它出错)。