如何在dylib中进行Python3.6.5负载扩展

问题描述 投票:1回答:1

之前已经问过,但是给定的解决方案是不可接受的。我在name.dylib中有一个CPython扩展名,无法导入。如果文件名更改为使用name.so,则将正确导入。更改文件名不是一个选择**,并且没有必要。

Python有很多用于搜索模块的钩子,因此必须有一种使其能够识别dylib的方法。有人可以显示如何执行此操作吗?使用低级导入(拼出整个文件名)不是很好,但是可以接受。

**,因为构建代码强制使用dylib,在其他上下文中,我也假设它。扩展模块是双重用途的,可以同时用作普通共享库和Python扩展。使用symlink确实可以,但是由于必须在自动化过程中进行手动干预,因此是最后的选择。

python macos cpython
1个回答
0
投票

您可以操纵sys.path_hooks,并用可接受sys.path_hooks扩展名的钩子代替FileFinder钩子。例如,可以在此FileFinder中找到有关如何导入.dylib.so.py文件的更多信息。

该操作可能类似于以下内容:

.pyc

必须是开始运行python-script时执行的第一个代码。其他模块可能不希望在程序运行期间在某处对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 xxx.dylib via import xxx sys.path_hooks等)可能会出现一些问题。例如:

pdb

将失败,同时

traceback

将起作用,因为import pdb #above code import xxx 似乎操纵了进口机器。


通常,#above code import pdb import xxx 钩子是pdb中的最后一个钩子,因为它是最后的手段,一旦为路径调用FileFinder,就返回查找器(如果sys.path_hooks应该查看更多的挂钩):

path_hook_for_FileFinder

但是,可能需要确定并检查,确实右钩已被更换。

© www.soinside.com 2019 - 2024. All rights reserved.