使用swig生成python模块的scons工具
scons-tool-swigp的Python项目详细描述
安装
为您的项目安装此工具的方法很少。
来自pypi
如果在virtualenv下构建项目,则此方法可能更可取。到 从pypi添加swigpy工具,键入(在wirtualenv中):
pip install scons-tool-loader scons-tool-swigpy
或者,如果您的项目使用pipenv:
pipenv install --dev scons-tool-loader scons-tool-swigpy
或者,您可以将其添加到您的Pipfile
[dev-packages] scons-tool-loader = "*" scons-tool-swigpy = "*"
该工具将作为命名空间包^{tt2}安装$ 在项目的虚拟环境中。您可以进一步使用scons-tool-loader 加载工具。
作为git子模块
创建新的git存储库:
mkdir /tmp/prj &&cd /tmp/prj touch README.rst git init
将scons-tool-swigpy作为子模块添加:
git submodule add git://github.com/ptomulik/scons-tool-swigpy.git site_scons/site_tools/swigpy
对于python 2.x,在site_tools目录中创建__init__.py:
touch site_scons/site_tools/__init__.py
这将允许直接导入site_tools.swigpy(这可能是其他工具所必需的)。
用法示例
git项目
创建一些源文件,例如src/hello.hpp和
src/hello.cpp:
// src/hello.hpp
#ifndef HELLO_HPP
#define HELLO_HPP
voidhello();#endif
// src/hello.cpp
#include"hello.hpp"
#include<iostream>voidhello(){std::cout<<"Hello"<<std::endl;}
创建swig接口文件src/hello.i
// src/hello.i
%modulehello;%{#include"hello.hpp"%}%include"hello.hpp"
写入SConstruct文件:
# SConstructenv=Environment(tools=['default','swigpy'])SConscript('src/SConscript',exports=['env'],variant_dir='build',duplicate=0)
写入src/SConscript:
# src/SConscriptImport(['env'])env.Append(SWIGPY_CPPPATH=['.'])env.Append(SWIGPY_LIBPATH=['.'])env.Append(SWIGPY_SWIGFLAGS=['-c++'])env.SharedLibrary('hello',['hello.cpp'])env.SwigPyModule('hello',SWIGPY_LIBS=['$SWIGPY_PYTHONLIB','hello'])
试试看:
scons
这将创建库build/libhello.so和所有
组成它的python包装器:
ptomulik@tea:$ ls build/
hello.os hello.pyc hello_wrap.cc libhello.so
hello.py _hello.so hello_wrap.os
测试生成的包装:
cd build
LD_LIBRARY_PATH='.' python
>>> import hello
>>> hello.hello()
创建一些源文件,例如src/hello.hpp和 src/hello.cpp:
// src/hello.hpp #ifndef HELLO_HPP #define HELLO_HPP voidhello();#endif
// src/hello.cpp #include"hello.hpp" #include<iostream>voidhello(){std::cout<<"Hello"<<std::endl;}
创建swig接口文件src/hello.i
// src/hello.i %modulehello;%{#include"hello.hpp"%}%include"hello.hpp"
写入SConstruct文件:
# SConstructenv=Environment(tools=['default','swigpy'])SConscript('src/SConscript',exports=['env'],variant_dir='build',duplicate=0)
写入src/SConscript:
# src/SConscriptImport(['env'])env.Append(SWIGPY_CPPPATH=['.'])env.Append(SWIGPY_LIBPATH=['.'])env.Append(SWIGPY_SWIGFLAGS=['-c++'])env.SharedLibrary('hello',['hello.cpp'])env.SwigPyModule('hello',SWIGPY_LIBS=['$SWIGPY_PYTHONLIB','hello'])
试试看:
scons
这将创建库build/libhello.so和所有 组成它的python包装器:
ptomulik@tea:$ ls build/ hello.os hello.pyc hello_wrap.cc libhello.so hello.py _hello.so hello_wrap.os
测试生成的包装:
cd build LD_LIBRARY_PATH='.' python >>> import hello >>> hello.hello()
详细信息
模块说明
模块提供了一个生成python模块的SwigPyModule()builder 基于swig接口*.i文件:
SwigPyModule(modname, **overrides)
modname是正在生成的模块的名称,例如'foo' 或者'foo.bar'(注意,它既不是源文件名也不是目标文件 姓名)。重写重写构造变量,如SWIGFLAGS 或CFLAGS。
示例1:
以下代码要求存在一个foo.i接口文件,并且 生成由该文件定义的python模块。
SwigPyModule('foo')
示例2:
以下代码要求存在一个foo/bar.i接口文件 并生成由这个文件undeffoo子目录定义的python模块。
SwigPyModule('foo.bar')
构造变量
SwigPyModule使用的构造变量总结如下 桌子。注意有两组变量。第一组是 众所周知的变量,如CFLAGS或SWIGFLAGS。第二组是 以SWIGPY_为前缀的变量。如果定义了这些变量,则覆盖 生成python绑定时的已知变量。
Variable | Default |
---|---|
SWIG | |
SWIGVERSION | |
SWIGFLAGS | |
SWIGDIRECTORSUFFIX | |
SWIGCFILESUFFIX | |
SWIGCXXFILESUFFIX | |
SWIGPATH | |
SWIGINCPREFIX | |
SWIGINCSUFFIX | |
SWIGCOM | |
CPPPATH | |
SHLIBPREFIX | |
CCFLAGS | |
CFLAGS | |
CXXFLAGS | |
LIBS | |
LIBPATH | |
LDFLAGS | |
SWIGPY_SWIG | |
SWIGPY_SWIGVERSION | |
SWIGPY_SWIGFLAGS | ^{tt24}$ |
SWIGPY_SWIGDIRECTORSUFFIX | |
SWIGPY_SWIGCFILESUFFIX | |
SWIGPY_SWIGCXXFILESUFFIX | |
SWIGPY_SWIGPATH | |
SWIGPY_SWIGINCPREFIX | |
SWIGPY_SWIGINCSUFFIX | |
SWIGPY_SWIGCOM | |
SWIGPY_CPPPATH | ^{tt25}$ |
SWIGPY_SHOBJPREFIX | |
SWIGPY_SHOBJSUFFIX | |
SWIGPY_SHLIBPREFIX | ^{tt26}$ |
SWIGPY_SHLIBSUFFIX | ^{tt27}$ on Windows |
SWIGPY_LIBPREFIX | ^{tt26}$ |
SWIGPY_LIBSUFFIX | |
SWIGPY_IMPLIBPREFIX | ^{tt26}$ |
SWIGPY_IMPLIBSUFFIX | |
SWIGPY_WINDOWSEXPPREFIX | ^{tt26}$ |
SWIGPY_WINDOWSEXPSUFFIX | |
SWIGPY_CC | |
SWIGPY_CXX | |
SWIGPY_SHCC | |
SWIGPY_SHCXX | |
SWIGPY_CCFLAGS | |
SWIGPY_CFLAGS | |
SWIGPY_CXXFLAGS | |
SWIGPY_SHCCFLAGS | |
SWIGPY_SHCFLAGS | |
SWIGPY_SHCXXFLAGS | |
SWIGPY_LIBS | ^{tt31}$ |
SWIGPY_LIBPATH | ^{tt32}$ |
SWIGPY_LINKFLAGS | |
SWIGPY_M2SWIGFILE | ^{tt33}$ |
SWIGPY_M2CFILE | ^{tt34}$ |
SWIGPY_M2SHLIBFILE | ^{tt34}$ |
swigpy_m2swigfilelambda确定swig接口的名称(source 文件)。swigpy_m2cfile确定c的名称(不带后缀) 或^ {STR 1 } $C++< /Stult>包装文件由^ {STR 1 } $SWIG < /强>生成。swigpy_m2shlib文件 确定将包含包装器二进制代码的共享库的名称 编译后(没有前缀和后缀)。部分提供给 这些宏是modname的一部分,这是 modname.split('.')。
许可证
版权所有(c)2014-2018 Pawel Tomulik<;ptomulik@meil.pw.edu.pl>;
兹免费准许任何人取得副本 本软件和相关文档文件(“软件”)的 在软件中不受限制,包括但不限于 使用、复制、修改、合并、发布、分发、再授权和/或出售 软件的副本,并允许软件的用户 有条件这样做,但须遵守以下规定不良反应条件:
上述版权公告及本许可公告须包括在 软件的拷贝或大部分。
软件按原样提供,无任何形式的保证,明示或 默示的,包括但不限于适销性保证, 适合某一特定目的和非侵犯性。在任何情况下 作者或版权所有者应对任何索赔、损害或其他 责任,无论是在诉讼或合同中,侵权行为或其他,产生于, 不属于或与本软件有关,或使用或与本软件的其他交易有关。 软件