直接从Python导入C++文件!

cppimport的Python项目详细描述


#####如果您使用过CPPImport版本0.0.*,请使用一些新功能!编译器参数,多个源文件,错误修复!继续阅读。
BR/>直接从Python导入C或C++文件!
让我们试试。首先,如果您在Linux或OS X上,请使用终端命令"pip install cppinport"进行安装。

大多数cppinport用户将其与[pybind11]结合使用(https://github.com/pybind/pybind11),但您可以使用一系列方法来创建Python扩展。原始C扩展,boost.python,swig都可以。> /*
SETUPUPYBIND11(CFG)
α包括:PYBIND11/PYBIND11。h & gt;
命名空间Py=PyBIND11;
BR/> int方(INTx){BR/>返回X*X;
} BR/>< BR/> BR/> PybIND11-模(SoucDead,m){Br/> m。让我们来看看一个简单的C++扩展:
BR/> 'C++BR/def("square"&;square);
}
```

>将此代码保存为"somecode.cpp"。

>打开一个python解释器并运行这些行[\[1]]("注意):
``python
>;>;import cppinort
>;>;somecode=cppinort.imp("somecode");这将暂停片刻以编译模块
& gt;& St.(9)
81
'BR/> BR/>我是工作流的一个大粉丝,这使得你可以编辑C++文件和Python并重新编译透明地发生。
BR/>我希望事情变得更容易!(python import hook)

这一定是在第一行。
'BR/> */BP/>>%BR/> SETUPUPYBIDEN11(CFG)
%G/
` BR/> BR/>然后导入导入钩子:
` Python
& gt;& gt;;这是进一步解释。要编译模块somecode.square(9)
81
````


BR/>**********CPPutlook寻找与所请求的模块相匹配的C或C++源文件。如果存在这样的文件,则首先通过mako模板系统运行该文件。然后使用mako pass生成的编译选项将文件编译为python扩展名。生成的扩展(共享库)被放置在与C++源文件相同的文件夹中。然后,加载扩展名。

**请使用更简单的语言:*有时python不够快。或者在C++库中有现有代码。所以,编写一个python*扩展模块*,一个编译代码库。我建议[pypyd11](HTTPS://GITHUBCOM/pybDun/pybDun11)用于C++到Python绑定或[CFFi](HTTPS://CFFI RealthDecsIO/Ent/Lestest/),用于C到Python绑定。这些年来我做了很多。但是,当我的开发过程从Python中的编辑-GT测试到*-python加C++中的编辑-&编译;&测试;因此,"cppinport"结合了在python中编译和导入扩展的过程,这样您就可以键入"modulename=cppinport.imp("modulename")",而不必担心多个步骤。在内部,"cppinport"查找文件"modulename.cpp"。如果找到一个,它将在mako模板系统中运行以收集编译器选项,然后将其编译并作为扩展模块加载。

请注意,由于mako预处理,可能会忽略配置块周围的注释。

必要时:
编译只应在第一次导入模块时进行。将C++源与每个导入的校验和进行比较,以确定文件是否已更改。其他依赖项(头文件!)可以通过添加到mako头来跟踪:
```
cfg['dependencies']=['file1.h','file2.h']
````


```
cfg['linker_args']=['…']
cfg['compiler_args']=['…']
cfg['libraries'[BR/c] [BR/> 'BR/> 'BR/>< BR/>例如,使用C++ 11,添加:
′BR/>和<%BR/> CFG [ '''sCluleR'ARG' '=
%%gt;

BR/>
```
cfg['sources']=['…']
```


调用"cppumport.set_quiet(false)"将导致有助于调试编译错误的输出。

在具有多个源的扩展上编译。

(对于未初始化的增量编译,只需重新编译已更改或包含已更改头的源文件。)

cppumport构建在setuptools和distutils(py的标准库)之上丁字裤的包装和分销。不幸的是,setuptools不支持增量编译。我建议遵循[此SO答案](http://stackoverflow.com/questions/11013851/speeding build process with distutils)上的建议。即:

1。使用ccache(大规模)降低重建成本
2。启用并行编译。这可以用c++文件的配置头中的"CFG [并行] ]=Trror来完成。
BR> >我在模块配置代码中需要有关文件名的信息!模块名称可作为"FullNeX"变量,C++模块文件可用为"FielPATH"。例如:BR/>‘BR/>和L.%BR/>模块-DIR= OS.Prime.DrimeNo.FrimeNo.Br/> %& gt;
``BR/>
α>为什么导入钩子需要在CPP文件的第一行上"CPPP导入"?
修改python导入系统是一个全局修改,因此会影响从任何其他包的所有导入。因此,为了避免意外地破坏另一个包,导入钩子使用一个"Opt in"系统,其中C和C++文件可以指定它们要与CPPP导入一起使用,包括在文件的第一行上包含短语"CPPP导入"的注释。

窗户?
我在mingw-w64和python 3.6中使用了"cppinport",并取得了很好的成功。我也有报告说,"CPPututin"在Python 3.6和Visual C++ 2015的构建工具上运行在Windows上。主要的挑战是确保distutils知道可用的编译器。试试建议[这里](https://stackoverflow.com/questions/3297254/how to use mingws gcc compiler when installing python package using pip)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java无法启动应用程序:JNLP错误   java根据用户输入在PreparedStatement中使用setTime()或setNull()   java EJB与同步   java以object为键通过hashmap进行搜索   java中的模10^9+7   针对包含其他对象的对象的java OOP最佳实践   如何将字符串作为HTML代码从Java文件读取到JSP页面?   java我的POM怎么了?“解析表达式..检测到递归表达式循环”   用于Hbase的Mapreduce的java NoSuchMethodError   JAVAlang.SecurityException:权限拒绝:启动意图{act=安卓.Intent.action.MAIN cat=[安卓.Intent.category.LAUNCHER]   数组初始化谜语Java   通过arraylist搜索时的java句柄关联