python编译的so动态链接库

使用 python setup.py build_ext --inplace生成的so动态链接库;

通过一系列实验,得出以下结论:

结论一、无论放在哪个层级目录下,都可以调用

结论二、so动态链接库中依赖其他的包或者python文件,不会把其他依赖的内容包含进来。换句话说,如果单单移走so库,就无法正确执行

结论三、so动态链接库保存的信息仅仅是你编译的pyx文件;执行原理可以想象是对应的py文件。没有区别。

结论四、如果包含相对导入,也是可以执行的,无论主调用文件在哪个目录下,相对导入不受影响。当前目录可以执行,那么再上层目录也可以执行。

生成动态链接库的方法:

第一种方法:from distutils.core import setup, Extension

第二种方法:from setuptools import setup, find_packages, Extension

第二种方法更好些。

setup文件如下:

import os
import platform
import re
import sys
from distutils.sysconfig import get_config_var
from distutils.version import LooseVersion
from setuptools import setup, find_packages, Extension

import numpy as np
from Cython.Build import cythonize
from Cython.Distutils import build_ext

cy_extension_kw = dict()
repo_root = os.path.dirname(os.path.abspath(__file__))
if 'MSC' in sys.version:
    extra_compile_args = ['/Ot', '/I' + os.path.join(repo_root, 'misc')]
    cy_extension_kw['extra_compile_args'] = extra_compile_args
else:
    extra_compile_args = ['-O3']
    cy_extension_kw['extra_compile_args'] = extra_compile_args


extra_compile_args = ['-O3']
cy_extension_kw['extra_compile_args'] = extra_compile_args
cy_extension_kw['include_dirs'] = [np.get_include()]
cy_extensions = [
    Extension('dag_graph.graph', ['dag_graph/graph.pyx'], **cy_extension_kw),
    Extension('dag_graph.optimizes.chunk_graph.fuse', ['dag_graph/optimizes/chunk_graph/fuse.pyx'], **cy_extension_kw),
    Extension('dag_graph._utils', ['dag_graph/_utils.pyx'], **cy_extension_kw),
    Extension('dag_graph.lib.gipc', ['dag_graph/lib/gipc.pyx'], **cy_extension_kw),
    Extension('dag_graph.actors.core', ['dag_graph/actors/core.pyx'], **cy_extension_kw),
    Extension('dag_graph.actors.distributor', ['dag_graph/actors/distributor.pyx'], **cy_extension_kw),
    Extension('dag_graph.actors.cluster', ['dag_graph/actors/cluster.pyx'], **cy_extension_kw),
    Extension('dag_graph.actors.pool.messages', ['dag_graph/actors/pool/messages.pyx'], **cy_extension_kw),
    Extension('dag_graph.actors.pool.utils', ['dag_graph/actors/pool/utils.pyx'], **cy_extension_kw),
    Extension('dag_graph.actors.pool.gevent_pool', ['dag_graph/actors/pool/gevent_pool.pyx'], **cy_extension_kw),
    Extension('dag_graph.serialize.core', ['dag_graph/serialize/core.pyx'], **cy_extension_kw),
    Extension('dag_graph.serialize.pbserializer', ['dag_graph/serialize/pbserializer.pyx'], **cy_extension_kw),
    Extension('dag_graph.serialize.jsonserializer', ['dag_graph/serialize/jsonserializer.pyx'], **cy_extension_kw),
]

extensions = cythonize(cy_extensions) + \
    [Extension('dag_graph.lib.mmh3', ['dag_graph/lib/mmh3_src/mmh3module.cpp', 'dag_graph/lib/mmh3_src/MurmurHash3.cpp'])]


setup_options = dict(
    name='pydag_graph',
    ext_modules=extensions,
)
setup(**setup_options)

本质是调用setup函数,函数里面包含ext_modules参数;该参数接受字符数据类型、元素为字符数据的列表,元素为Extension对象的列表。

Extension信息更全面,更好用,以后默认使用Extension;

Extension第一个参数有保存指定路径的效果

如果仅仅是一个名称,会保存在当下目录,而不能保存到跟pyx文件同级目录

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python可以通过使用C或C++编写的扩展模块来封装成动态链接库(DLL)。这可以通过使用Python的C API和相应的编译器工具实现。 首先,我们需要使用C或C++编写一个扩展模块。这个扩展模块包含在Python中定义的函数,以及与Python解释器交互的代码。在扩展模块中,可以使用Python提供的C API来调用Python解释器,执行Python代码或访问Python对象。 接下来,我们需要将这个扩展模块编译动态链接库。在Windows上,可以使用Microsoft Visual C++或MinGW等工具,将C或C++代码编译成DLL。在Linux上,可以使用GCC等编译器。 完成编译后,我们可以在Python中使用ctypes模块来加载和调用这个动态链接库。ctypes模块提供了一种使用动态链接库的简单方法,它可以自动处理函数导出和数据类型转换。 通过加载这个动态链接库,我们可以在Python中直接调用其中定义的函数,而无需了解其底层的C或C++实现细节。这种方式使得我们可以在Python中使用高性能、底层的C或C++代码,同时保持Python的简洁和易用性。 总结而言,Python可以通过编写扩展模块,并将其编译动态链接库,实现封装。这种方法可以提供Python与底层C或C++代码的无缝集成,以及更高的性能和灵活性。 ### 回答2: Python可以使用ctypes模块将其封装为动态链接库(DLL),以便在其他编程语言中使用Python代码。以下是封装Python动态链接库的步骤: 1. 导入ctypes模块:首先要导入ctypes模块,该模块允许Python与C库进行交互。 2. 加载Python解释器:使用ctypes模块的cdll.LoadLibrary函数加载Python解释器。此步骤将Python解释器加载到内存中。 3. 封装Python函数:使用ctypes模块的CFUNCTYPE函数定义Python函数的签名。然后可以使用ctypes模块的函数指针将Python函数转换为C函数。 4. 导出C函数:将C函数导出为动态链接库的接口,以便其他编程语言可以调用。 5. 调用动态链接库:在其他编程语言中,可以使用相应的库加载机制来加载和调用Python函数。 通过以上步骤,可以将Python代码封装为动态链接库,以便在其他编程语言中使用。这种封装方式有助于在其他语言中重用Python代码,并提供了跨语言开发的便利性。 ### 回答3: Python可以将模块封装成动态链接库,使其可以被其他编程语言调用。Python提供了一种称为ctypes的标准库,可用于将Python模块封装成动态链接库。 使用ctypes,可以将Python模块转化为可在其他编程语言中使用的动态链接库。要封装Python模块为动态链接库,需要遵循以下步骤: 1. 导入ctypes模块 2. 找到要封装的Python模块 3. 定义所需的函数和数据结构 4. 将函数和数据结构包装在一个类中 5. 使用ctypes将该类转化为动态链接库 下面是一个简单的示例,将一个Python函数封装成动态链接库: ```python import ctypes # 导入Python模块 import math # 定义包装类 class MathFunctions: # 封装函数 @staticmethod def calculate_sine(x): return math.sin(x) # 将类转化为动态链接库 lib = ctypes.CDLL('./libmath.so') lib.calculate_sine.restype = ctypes.c_double lib.calculate_sine.argtypes = [ctypes.c_double] # 使用动态链接库中的函数 result = lib.calculate_sine(1.0) print(result) ``` 在上面的示例中,`lib = ctypes.CDLL('./libmath.so')`将类`MathFunctions`转化为动态链接库。然后,可以使用动态链接库中的函数`calculate_sine`来计算正弦值。 通过这种方式,Python模块可以被其他编程语言调用,从而扩展了Python的应用范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值