基本上我有3个文件夹:
-
CPROJECT
, C++ 库:生成一个libcproject.so
共享对象
-
CYPROJECT
, cythonized Python 扩展:生成cyproject.so
使用 Cython
-
DEPENDENCIES
,依赖项:我在其中复制两个项目的外部需求
In 1.我构建了 C++ 扩展(用 gcc 编译 --shared
, -fPIC
编译选项)将暴露给 python 并且CYPROJECT
依赖于向 Python 公开功能。作为后处理命令,结果.so
被复制到DEPENDENCIES/libcproject/
(以及include
文件)。这样,该库当然也可以在纯 C++ 项目中独立使用。
In 2.我使用 3 个子文件夹:
-
adapters
:主要包含 C++ 附加类(通常是从 C++ 提供的类派生的类)libcproject.so
)。这些通常是通过特定于 Cython 需求的功能来增强的类(例如存储PyObject *
目标 Python 版本的 C 版本 - 继承自object
- 给定类和引用计数管理,通过Py_XINCREF
and Py_DECREF
, ...).
-
pyext
:所有 Cython 手写都存储在哪里.pyx
files.
-
setup
: 包含setup.sh
脚本(用于设置依赖路径并调用python setup.py build_ext --inplace
用于生成最终的cyproject.so
(要添加到PYTHONPATH
) and cyproject.pyx
.
那么里面有什么setup
子文件夹?
这是一个示例代码setup.sh
:
export PYTHONPATH=$PYTHONPATH:../../../DEPENDENCIES/Cython-0.18
export PATH=$PATH:../../../DEPENDENCIES/libcproject:../../../DEPENDENCIES/Cython-0.18/bin
# Note the `../../../DEPENDENCIES/libcproject`...
CC="gcc" \
CXX="g++" \
python setup.py build_ext --inplace
这里有一个例子setup.py
(主要是为了演示如何附加adapters
已编译):
import sys
import os
import shutil
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
# Cleaning
for root, dirs, files in os.walk(".", topdown=False):
for name in files:
if (name.startswith("cyproject") and not(name.endswith(".pyx"))):
os.remove(os.path.join(root, name))
for name in dirs:
if (name == "build"):
shutil.rmtree(name)
# Building
setup(
cmdclass = {'build_ext': build_ext},
ext_modules = [
Extension("cyproject",
sources=["cyproject.pyx", \
"adapter/ALabSimulatorBase.cpp", \
"adapter/ALabSimulatorTime.cpp", \
"adapter/ALabNetBinding.cpp", \
"adapter/AValueArg.cpp", \
"adapter/ALabSiteSetsManager.cpp", \
"adapter/ALabSite.cpp", \
],
libraries=["cproject"],
language="c++",
extra_compile_args=["-I../inc", "-I../../../DEPENDENCIES/python2.7/inc", "-I../../../DEPENDENCIES/gsl-1.8/include"],
extra_link_args=["-L../lib"]
extra_compile_args=["-fopenmp", "-O3"],
extra_link_args=[]
)
]
)
最后,主要的.pyx
,链接所有手写的.pyx
cython 部分的 s 一起 [cyproject.pyx
] :
include "pyext/Utils.pyx"
include "pyext/TCLAP.pyx"
include "pyext/LabSimulatorBase.pyx"
include "pyext/LabBinding.pyx"
include "pyext/LabSimulatorTime.pyx"
...
注意:Cython 生成的所有文件都保留在此setup
文件夹,与手写的东西分开(adapters
and pyext
),正如预期的那样。
In 3.使用分离的DEPENDENCIES
文件夹允许将事物分开(以防我将移动CYPROJECT
- 及其依赖项 - 在其他一些环境中)。
所有这些都是为了让您对如何组织此类项目有一个概述(我希望是一个相关的概述)。