分发独立的libpython路径

时间:2013-12-14 10:42:54

标签: python linux path

在较新的Ubuntu / Debian版本下,libpython2.7.so位于/usr/lib/i386-linux-gnu/libpython2.7.so/usr/lib/x86_64-linux-gnu/libpython2.7.so等之下。早期,无论架构如何,都可以在/usr/lib/libpython2.7.so中找到它们。我没有检查其他发行版。如何使用python找到libpython2.7.so的路径?

3 个答案:

答案 0 :(得分:8)

使用pkg-config不是最佳选择 - 它不会区分不同的Python安装,只返回系统安装。最好使用Python可执行文件来发现libpythonX.Y.so的位置。

从Python内部:

   from distutils import sysconfig;
   print sysconfig.get_config_var("LIBDIR")

或者在Makefile中:

   PYTHON_LIBDIR:=$(shell python -c 'from distutils import sysconfig; print sysconfig.get_config_var("LIBDIR")')

这将从$PATH中的第一个Python可执行文件中发现位置,因此如果系统上有多个Python安装,它将起作用。

归功于Niall Fitzgerald指出这一点。

答案 1 :(得分:1)

这是我的解决方案,它似乎适用于系统范围的Debian和CentOS安装,Debian上的anaconda,OSX上的miniconda,Debian上的virtualenv ......但是OSX上的系统级python失败了:

from distutils import sysconfig;
import os.path as op;
v = sysconfig.get_config_vars();
fpaths = [op.join(v[pv], v['LDLIBRARY']) for pv in ('LIBDIR', 'LIBPL')]; 
print(list(filter(op.exists, fpaths))[0])

在这里它在我的笔记本电脑上运行:

$> for p in python python3 ~/anaconda-4.4.0-3.6/bin/python ~datalad/datalad-master/venvs/dev/bin/python ; do $p -c "from distutils import sysconfig; import os.path as op; v = sysconfig.get_config_vars(); fpaths = [op.join(v[pv], v['LDLIBRARY']) for pv in ('LIBDIR', 'LIBPL')]; print(list(filter(op.exists, fpaths))[0])"; done                                                                                                                               
/usr/lib/python2.7/config-x86_64-linux-gnu/libpython2.7.so                                                      
/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6m.so
/home/yoh/anaconda-4.4.0-3.6/lib/libpython3.6m.so
/usr/lib/python2.7/config-x86_64-linux-gnu/libpython2.7.so

P.S。我不知道这是一个问题......糟糕的坏坏Python

答案 2 :(得分:0)

我假设您正在寻找链接此文件。 Python通常与pkgconfig信息一起安装,以帮助编译它。特别是对于.so文件,您应该使用pkg-config --libs python-2.7。来自Python:

import subprocess
subprocess.check_output(["pkg-config", "--libs", "python-2.7"])

如果显示的唯一标志是-lpython2.7,您可能需要考虑阅读/etc/ld.so.conf以查看链接器查找其库的默认位置。