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