gpt4 book ai didi

python - 如何加载 dylib 文件作为 CPython 扩展?

转载 作者:太空宇宙 更新时间:2023-11-03 19:48:29 25 4
gpt4 key购买 nike

之前已询问过此问题(例如 here ),但给定的解决方案(即将文件重命名为 *.so)是 Not Acceptable 。我有一个名为 name.dylib 的 CPython 扩展,无法导入。如果文件名更改为使用 name.so,则可以正确导入。更改文件名不是一个选项**,也没有必要。

Python 有很多用于搜索模块的钩子(Hook),因此必须有一种方法让它识别 dylib 文件。有人可以展示如何做到这一点吗?使用低级导入来拼写出整个文件名虽然不太好,但却是一个可以接受的解决方案。

** 因为构建代码强制使用 dylib,并且我已经假设了其他上下文。扩展模块有双重用途,它既可以用作普通共享库,也可以用作Python扩展。使用符号链接(symbolic link)确实有效,但这是最后的手段,因为它需要在自动化过程中进行手动干预。

最佳答案

您可以操纵 sys.path_hooks并替换FileFinder - 与接受 .dylib 扩展名的钩子(Hook)。但另请参阅更简单但不太方便的替代方案,该替代方案将在给定扩展名的完整文件名的情况下导入。

更多关于如何导入 .so.py.pyc 文件的信息可以在 answer of mine 中找到。 。

此操作可能如下所示:

import sys
import importlib
from importlib.machinery import FileFinder, ExtensionFileLoader

# pick right loader for .dylib-files:
dylib_extension = ExtensionFileLoader, ['.dylib']

# add dylib-support to file-extension supported per default
all_supported_loaders = [dylib_extension]+ importlib._bootstrap_external._get_supported_file_loaders()


# replace the last hook (i.e. FileFinder) with one recognizing `.dylib` as well:
sys.path_hooks.pop()
sys.path_hooks.append(FileFinder.path_hook(*all_supported_loaders))

#and now import name.dylib via
import name

当 python 脚本开始运行时,这必须是执行的第一个代码。其他模块可能不希望在程序运行期间在某个地方操作 sys.path_hooks,因此其他模块可能会出现一些问题(例如 pdbtraceback等等)。例如:

import pdb

#above code

import name

会失败,而

#above code

import pdb

import name

可以工作,因为pdb似乎可以操纵导入机器。

<小时/>

通常,FileFinder-hook 是 sys.path_hooks 中的最后一个,因为它是最后的手段,一次 path_hook_for_FileFinder为路径调用,返回查找器(如果 PathFinder 应该查看更多钩子(Hook),则应该引发 ImportError):

def path_hook_for_FileFinder(path):
"""Path hook for importlib.machinery.FileFinder."""
if not _path_isdir(path):
raise ImportError('only directories are supported', path=path)
return cls(path, *loader_details) # HERE Finder is returned!

但是,人们可能想确定并检查右钩子(Hook)是否确实已被替换。

<小时/>

更简单的替代方案是使用 imp.load_dynamic (暂时忽略 imp 已弃用的情况):

import imp
imp.load_dynamic('name', 'name.dylib') # or what ever path is used

这可能比第一个解决方案更强大(例如,pdb 没有问题),但对于更大的项目来说不太方便。

关于python - 如何加载 dylib 文件作为 CPython 扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59986274/

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