python 包安装位置与前缀不一致

inconsistent python package installation location with prefix

我正在安装带有前缀的 python 包,但出现以下错误。

$ python3 setup.py install --prefix=$HOME/some_prefix
running install

You are attempting to install a package to a directory that is not
on PYTHONPATH and which Python does not read ".pth" files from.  The
installation directory you specified (via --install-dir, --prefix, or
the distutils default setting) was:

    /home/user/some_prefix/lib64/python3.4/site-packages/

and your PYTHONPATH environment variable currently contains:

    ''

当然可以export PYTHONPATH=/home/user/some_prefix/lib64/python3.4/site-packages:$PYTHONPATH。但是鉴于该路径具有 python 版本,我从 How do I find the location of my Python site-packages directory?

中找到了一种奇特的方式
$ python3 -c "import distutils.sysconfig as sc; print(sc.get_python_lib(prefix=\"$HOME/some_prefix\"));"
/home/user/some_prefix/lib/python3.4/site-packages

不幸的是,它们在 lib 部分不匹配,除了可以忽略不计的尾随 /。所以还是失败了。

$ python3 setup.py install --prefix=$HOME/some_prefix
running install

You are attempting to install a package to a directory that is not
on PYTHONPATH and which Python does not read ".pth" files from.  The
installation directory you specified (via --install-dir, --prefix, or
the distutils default setting) was:

    /home/user/some_prefix/lib64/python3.4/site-packages/

and your PYTHONPATH environment variable currently contains:

    '/home/user/some_prefix/lib/python3.4/site-packages'

现在,我该如何正确匹配呢?

我查看了文档,但我认为没有相关论据。

https://docs.python.org/3/distutils/apiref.html#module-distutils.sysconfig distutils.sysconfig.get_python_lib([plat_specific[ standard_lib[ prefix]]])¶

$ python3 -c "import distutils.sysconfig as sc; print(sc.get_python_lib(\"A\", \"B\", \"C\"));"
C/lib64/python3.4

还有,哪个是对的?是 lib 还是 lib64?我在 /usr/lib.

中看到更多包裹
$ ll /usr/lib/python3.4/site-packages/ | wc
     70     554    5408
$ ll /usr/lib64/python3.4/site-packages/ | wc
     11      82     764

我正在使用标准 python 来自 centos 7.

$ uname -a
Linux localhost 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
$ which python3
/usr/bin/python3
$ python3 --version
Python 3.4.8

Fedora/CentOS patches various Python module to alter the installation locations, see this ServerFault post on the difference between /usr/lib and /usr/lib64.

请注意,/usr/lib64 路径仅用于 平台特定代码 ,不适用于纯 python 库。所以正确的使用方法是将 plat_specific argument to get_python_lib() (第一个)设置为 True:

$ python3 -c "import distutils.sysconfig as sc; print(sc.get_python_lib(True, prefix=\"$HOME/some_prefix\"))"

但是,如果您的目标前缀目录是用于 单独的 Python 安装而没有 Fedora / CentOS 补丁 ,那么您真的应该使用 Python二进制 安装在该前缀中 以处理安装:

$HOME/some_prefix/bin/python3 setup.py install

它将配备所有正确的系统配置,包括未打补丁的 distutils 和具有正确本地 $PREFIX 值且没有 PYTHONPATHsysconfig 模块将发出警告。

如果您想将软件包与系统安装隔离开来,请使用 virtualenv 并使用特定于环境的 Python 二进制文件进行安装:

$ virtualenv name_of_virtualenv_directory
$ name_of_virtualenv_directory/bin/python setup.py install