Skip to content
Generate Source Files for Python C/C++ Extensions(.pyd files) from C/C++ headers automatically.
C C++ Python Shell
Branch: master
Clone or download
nanoric [Mod] TODO.txt.
c2py已经支持太多的功能和特性,目前非常需要一个有效的CI以确保在新功能加入的时候,旧的功能不会被破坏。
Latest commit 8c185a1 Oct 28, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
3rd_party [Mod] change projects version to visual studio 2019 Apr 5, 2019
c2py
tests [Add] 增加对多维数组的支持 Oct 28, 2019
.gitignore [Mod] Added some files into .gitignore Oct 28, 2019
CHANGELOG.md
README.md Update README.md Sep 21, 2019
TODO.txt [Mod] TODO.txt. Oct 28, 2019
c2py.sln
env.props [Mod] rename project: rename into c2py Jul 26, 2019
setup.py

README.md

c2py

This tool is used for generate Source Files for C/C++ Extensions(.pyd files) from C/C++ headers.

Different with using libraries:

If you want to use C/C++ code in python. You can:

  • ctypes
  • Writing C Extension with boost.python or pybind11 or some other libraries.

In both ways, you must write your own code to generate a C Extension(.pyd file). Writing your own code require that you are experienced in C/C++ and TAKES A LONG TIME to coding.

Different with swig(tool)

You can also consider swig.

Swig is a well developed tool, which means that it has fewer bugs. But since swig uses a simplified parser, you have to maintain an extra interface file. And as its name, it is just a simple wrapper. You can always build a extension from swig, but that extension may be hard to use, unstable or even unusable.

c2py use clang as its parser, you don't have to maintain any extra file. And it has some built-in (and optional) transforms that will try to solve some special C/C++ code to make final python extension usable and stable.


In a word, with c2py you don't need to be so experienced in C/C++. It will try its best to help you resolve all the problem you might face when generating a binding from C/C++ to python.

All you need(in ideal situation), is just run c2py and then, build.

Project goal

We hope people can use any C/C++ code by just run c2py & build, leaving all the trouble to c2py.

Features:

  • to produce a pyd file(or its source) instead of just providing a binding library.
  • handles almost all the trouble you may face when writing your own code.
  • fully typed type hint files(.pyi files).
  • generated pyd has a identical layout as C++ namespace.
  • recognize almost everything in C++.(See TODO.txt for a full list.)
  • recognize constant declared by #define. (people writing C likes this)
  • Functions, class method, getters & setters can be customized using C++ template specialization if c2py is not good enough.(Wish you contribute your code to c2py instead of writing your own private solution)

install

pip install https://github.com/nanoric/c2py/archive/master.zip

Usage

> c2py generate --help
Usage: c2py generate [OPTIONS] MODULE_NAME [FILES]...

  Converts C/C++ .h files into python module source files. All matching is
  based on c++ qualified name, using regex.

Options:
  -e, --encoding TEXT             encoding of input files, default is utf-8
  -I, --include-path TEXT         additional include paths
  -A, --additional-include TEXT   additional include files. These files will
                                  be included in output cxx file, but skipped
                                  by parser.
  -ew, --string-encoding-windows TEXT
                                  encoding used to get & set string. This
                                  value is used to construct std::locale. use
                                  `locale -a` to show all the locates
                                  supported. default is utf-8, which is the
                                  internal encoding used by pybind11.
  -el, --string-encoding-linux TEXT
                                  encoding used to get & set string. This
                                  value is used to construct std::locale. use
                                  `locale -a` to show all the locates
                                  supported. default is utf-8, which is the
                                  internal encoding used by pybind11.
  -i, --ignore-pattern TEXT       ignore symbols matched
  --no-callback-pattern TEXT      disable generation of callback for functions
                                  matched (for some virtual method used as
                                  undocumented API)
  --no-transform-pattern TEXT     disable applying transforms(changing its
                                  signature) into functions matched (for some
                                  virtual method used as callback only)
  --inout-arg-pattern TEXT        make symbol(arguments only) as input_output
  --output-arg-pattern TEXT       make symbol(arguments only) as output only
  --m2c / --no-m2c                treat const macros as global variable
  --ignore-underline-prefixed / --no-ignore-underline-prefixed
                                  ignore global variables starts with
                                  underline
  --ignore-unsupported / --no-ignore-unsupported
                                  ignore functions that has unsupported
                                  argument
  --inject-symbol-name / --no-inject-symbol-name
                                  Add comment to describe every generated
                                  symbol's name
  -o, --output-dir PATH           module source output directory
  -p, --pyi-output-dir PATH       pyi files output directory
  --clear-output-dir / --no-clear-output-dir
  --clear-pyi-output-dir / --no-clear-pyi-output-dir
  --copy-c2py-includes TEXT       copy all c2py include files, excluding input
                                  files to specific dir.
  -m, --max-lines-per-file INTEGER RANGE
  --generate-setup TEXT           if set, generate setup.py into this location
  --setup-lib-dir TEXT
  --setup-lib TEXT
  --setup-use-patches / --setup-no-use-patches
  --enforce-version TEXT          Check if c2py version matches. If not match,
                                  print error and exit. Use this to prevent
                                  generating code from incompatible version of
                                  c2py.
  --help                          Show this message and exit.

Example

Just generate & run generated setup.py:

c2py generate vnctp                                     \
    ThostFtdcMdApi.h                                    \
    ThostFtdcTraderApi.h                                \
    ThostFtdcUserApiDataType.h                          \
    ThostFtdcUserApiStruct.h                            \
    -I                          vnctp/include/          \
    --no-callback-pattern       ".*Api::.*"             \
    --string-encoding-windows   .936                    \
    --string-encoding-linux     zh_CN.GB18030           \
                                                        \
    --copy-c2py-includes   vnctp/include/               \
    --output-dir                vnctp/generated_files/  \
    --clear-output-dir                                  \
                                                        \
    --generate-setup            .                       \
    --setup-lib-dir             vnctp/libs/             \
    --setup-lib                 thostmduserapi          \
    --setup-lib                 thosttraderapi

python ./setup.py build

autocxxpy is renamed into c2py!!!

You can’t perform that action at this time.