栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Cython将Python链接到共享库

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Cython将Python链接到共享库

当然可以!

(在下文中,我假设你已经知道如何处理

cimport
之间和交互
.pxd
.pyx
,如果这不是完全的情况下,只问我会开发部分以及)

示例(来自我的C ++项目,但是C项目的工作原理几乎相同):

1. Distutils安装文件:

假设将调用要创建的扩展名,

myext
并且第3方共享库为
libexternlib.so
(请注意 lib * 前缀,在此)…

# setup.py fileimport sysimport osimport shutilfrom distutils.core import setupfrom distutils.extension import Extensionfrom Cython.Distutils import build_ext# clean previous buildfor root, dirs, files in os.walk(".", topdown=False):    for name in files:        if (name.startswith("myext") and not(name.endswith(".pyx") or name.endswith(".pxd"))): os.remove(os.path.join(root, name))    for name in dirs:        if (name == "build"): shutil.rmtree(name)# build "myext.so" python extension to be added to "PYTHONPATH" afterwards...setup(    cmdclass = {'build_ext': build_ext},    ext_modules = [        Extension("myext",        sources=["myext.pyx",     "SomeAdditionalCppClass1.cpp",     "SomeAdditionalCppClass2.cpp" ],       libraries=["externlib"],          # refers to "libexternlib.so"       language="c++",        # remove this if C and not C++       extra_compile_args=["-fopenmp", "-O3"],       extra_link_args=["-DSOME_DEFINE_OPT",   "-L./some/extra/dependency/dir/"]  )        ])

注意: 您的外部

.so
文件通过以下
libraries
选项链接:

libraries=["externlib"]   # Without the 'lib' prefix and the '.so' extension...

注意:该

sources
选项可用于获取一些其他源文件的编译。

重要提示:(

myext.pxd
不要与
.pyd
Windows混淆),并且
myext.pyx
应该位于同一目录中。在编译时,将首先处理定义文件(如果存在)(更多内容)。

2.然后按以下方式运行:

将目录更改为包含your

myext.pxd
,your
myext.pyx
和上述
setup.py
脚本的目录后:

# setup.sh# Make the "myext" Python Module ("myext.so")CC="gcc"   CXX="g++"   CFLAGS="-I./some/path/to/includes/ -I../../../DEPENDENCIES/python2.7/inc -I../../../DEPENDENCIES/gsl-1.15"   LDFLAGS="-L./some/path/to/externlib/"       python setup.py build_ext --inplace

哪里:

  • libexternlib.so
    假定位于
    ./some/path/to/externlib/
  • yourheader.h
    假定位于
    ./some/path/to/includes/

注意:

CFLAGS
也可以使用
extra_compile_args
选项设置:

extra_compile_args=["-I./some/path/to/includes/", "-fopenmp", "-O3"]

注意:

LDFLAGS
也可以使用
extra_link_args
选项设置:

extra_link_args=["-L./some/path/to/externlib/", "-DSOME_DEFINE_OPT", "-L./some/extra/dependency/dir/"]

distutils完成构建后,您将获得一些新文件,特别是

myext.cpp
myext.h
最重要的是
myext.so

3.之后,您就可以开始:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./some/path/to/externlib/export PYTHonPATH=$PYTHONPATH:./some/path/to/myext/# Run some script requiring "myext.so"python somescript.py

新创建的Python扩展名可以通过其名称导入:

# somescript.pyimport myextfrom myext import PySomeFeature...

*有关优化的 *注意事项 :默认情况下

-O2
,用于编译扩展,但是可以重载(请参见上面
-O3
指定的设置)。

*有关Cython路径的 *注意事项 :如果将Cython安装在自定义目录中,则可能需要先将其添加到您的环境中:

PYTHonPATH=$PYTHONPATH:../../../DEPENDENCIES/Cython-0.18 export PYTHONPATH;PATH=$PATH:../../../DEPENDENCIES/Cython-0.18/bin; export PATH;

好吧,希望我能讲到要点…



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/650643.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号