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文件同级目录

你可能感兴趣的:(python)