gpt4 book ai didi

python-3.x - pip 如何告诉 Python 如何导入 C 扩展

转载 作者:行者123 更新时间:2023-12-02 18:46:43 26 4
gpt4 key购买 nike

我希望以可移植的方式使用 sysv_ipc 库。

我安装了它:

pip3 安装 sysv_ipc

然后从Python:

import sysv_ipc
sysv_ipc.__file__

# Output:
# /home/x/.local/lib/python3.9/site-packages/sysv_ipc.cpython-39-x86_64-linux-gnu.so

如果我将该文件复制到一个文件夹,pip uninstall 该库,然后从该文件夹打开 python 并尝试相同的导入,则会失败。

我尝试检查还安装了哪些内容,结果发现:

/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info
/home/x/.local/lib/python3.9/site-packages/sysv_ipc.cpython-39-x86_64-linux-gnu.so
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/INSTALLER
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/LICENSE
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/METADATA
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/RECORD
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/REQUESTED
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/WHEEL
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/top_level.txt

我在里面没有找到线索setup.py要么。

我想弄清楚的是 -

pip 如何/在哪里与要从该特定文件导入 sysv_ipc 的 Python 相关?

最佳答案

Pip 在 Python 如何处理扩展模块导入方面不起任何作用。 Python 所需要的只是扩展模块文件本身,前提是它采用当前操作系统支持的格式,并且该文件位于 sys.path 上的目录中。搜索路径。

Pip 只负责确保组成项目分发的文件最终位于 sys.path 中。地 pip 。 .dist-info您找到的目录是包元数据的一部分,由 pip 和 importlib.metadata 使用用于卸载、依赖性跟踪和报告等操作。导入时不会使用这些文件。

您还没有确切地分享您如何尝试导入扩展模块或如何失败,因此我无法评论您出了什么问题。

但是当一切正常时,从动态加载的共享对象库导入模块的工作方式与导入常规模块非常相似:

  1. Python 搜索 sys.path 上的所有目录使用 PathFinder object 列出与导入名称匹配的文件和目录。它知道根据文件扩展名查找扩展模块(支持的文件扩展名取决于您的操作系统,请参阅 importlib.machinery.EXTENSION_SUFFIXES 获取列表)。
  2. 如果发现扩展名后缀与导入名称匹配的文件,则 importlib.machinery.ExtensionFileLoader class用于加载库。

加载的意思是:使用依赖于操作系统的动态加载函数加载文件中的代码,然后访问入口 pip 函数(通常是 PyInit_<modulename> )来获取模块命名空间。请参阅documentation on creating extension modules 。对于 .so文件 Python/dynload_shlib.c file实现加载程序,但还有其他dynload_同一目录中的实现。加载 .so file Python 将文件路径(至少包含一个 / 斜线)传递给 dlopen() function .

至于您的情况可能出了什么问题:您使用了与安装项目时使用的不同的 Python 解释器。请注意,扩展模块文件名在模块名称后面包含一个字符串,用于标识 Python ABI ( Application Binary Interface ):

sysv_ipc.cpython-39-x86_64-linux-gnu.so
######## ^^^^^^^^^^^^^^^^^^^^^^^^^^^
module ABI identifier

该标识符使得可以将多个 Python 版本的扩展文件安装到同一目录中。请通过查看 importlib.machinery.EXTENSION_SUFFIXES 检查您的特定 Python 二进制文件接受哪些扩展。 :

$ python3 -c "from importlib.machinery import EXTENSION_SUFFIXES;print(EXTENSION_SUFFIXES)"
['.cpython-39-x86_64-linux-gnu.so', '.abi3.so', '.so']

输出告诉我这个解释器只会查找 sysv_ipc.cpython-39-x86_64-linux-gnu.so , sysv_ipc.abi3.so ,和sysv_ipc.so要加载的文件名。

给定的 Python 版本支持扩展模块可能想要使用的特定导出 C 函数,并且 ABI 会告诉您它是针对哪个版本进行编译的。使用短 abi3.so 的扩展后缀是根据 stable ABI 编译的,Python 功能的一个较小子集,保证存在于许多 Python 版本中。

虽然您可以重命名扩展文件以仅使用最短后缀( [module_name].so ),但它在很大程度上取决于动态加载的机器代码调用的 Python 功能(如果它仍然有效)不同的 Python 版本。

这是一个快速演示,显示您只需导入 sysv_ipc任意目录中的动态库,前提是我使用正确的 Python 版本:

$ virtualenv /demo
... creating a virtualenv ...
done.
$ cd /demo
demo/ $ source bin/activate
(demo) /demo/ $ pip install sysv_ipc
Collecting sysv_ipc
... installing ...
Successfully installed sysv-ipc-1.1.0
(demo) /demo/ $ mkdir newdir
(demo) /demo/ $ cp lib/python3.9/site-packages/sysv_ipc.cpython-39-x86_64-linux-gnu.so newdir
(demo) /demo/ $ pip uninstall -y sysv_ipc
Found existing installation: sysv-ipc 1.1.0
... uninstalling ...
Successfully uninstalled sysv-ipc-1.1.0
(demo) /demo/ $ cd newdir/
(demo) /demo/newdir/ $ python
Python 3.9.2 (default, Mar 15 2021, 17:53:50)
[Clang 7.0.1 (tags/RELEASE_701/final)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sysv_ipc
>>> sysv_ipc.__file__
'/demo/newdir/sysv_ipc.cpython-39-x86_64-linux-gnu.so'

关于python-3.x - pip 如何告诉 Python 如何导入 C 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67346644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com