当然可以!
(在下文中,我假设你已经知道如何处理
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不要与
.pydWindows混淆),并且
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;
好吧,希望我能讲到要点…



