标签: c-api

将C++数组发送到Python并返回(使用Numpy扩展C++)

我将发送一个c++数组到python函数,numpy array然后再返回另一个numpy array.在查阅了numpy文档和其他一些线程并调整代码后,最后代码正在运行,但我想知道这段代码是否以最佳方式编写,考虑到:

  • c++和之间不必要地复制数组numpy (python).
  • 正确解除变量的引用.
  • 简单直接的方法.

C++代码:

// python_embed.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include "Python.h"
#include "numpy/arrayobject.h"
#include<iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    Py_SetProgramName(argv[0]);
    Py_Initialize();
    import_array()

    // Build the 2D array
    PyObject *pArgs, *pReturn, *pModule, *pFunc;
    PyArrayObject *np_ret, *np_arg;
    const int SIZE{ 10 };
    npy_intp dims[2]{SIZE, SIZE};
    const int ND{ 2 }; …
Run Code Online (Sandbox Code Playgroud)

c++ python arrays numpy c-api

29
推荐指数
4
解决办法
2万
查看次数

SQLite:跨线程共享连接以进行读写

我有一个使用SQLite(版本3.7.2)来存储数据的应用程序.我在多个线程之间共享一个SQLite连接,它从同一个SQLite数据库中写入和读取.SQLite使用DSQLITE_THREADSAFE = 1编译,这意味着SQLite处于序列化模式.

引用SQLite文档

序列化:在序列化模式下,SQLite可以被多个线程安全地使用而没有任何限制.

相反,SQLite Wiki条目说

不要在多个线程中同时使用相同的数据库连接

我尝试了一个示例应用程序,它生成了数百个线程,并共享一个SQLite句柄来读写,哪个工作正常.

那么SQLite wiki条目是否过时,或者SQLite可能无法使用相同的连接同时处理来自不同线程的读写操作?

sqlite multithreading c-api

12
推荐指数
1
解决办法
7040
查看次数

跨C API边界传递异常

我正在用C++编写一个使用旧版C API的库.我的库的客户端可以指定回调函数,它通过我的库间接调用,通过C API调用.这意味着必须处理客户端回调中的所有异常.

我的问题是:如何在边界的一侧捕获异常,并在C API边界重新生成后重新抛出它,并且执行返回到C++域,以便客户端代码可以处理异常?

c++ exception-handling exception c-api

9
推荐指数
1
解决办法
1541
查看次数

什么dbus性能问题可以阻止它嵌入式系统?

从我的阅读中看,由于存在守护进程,dbus性能应该比其他消息传递ipc机制慢两倍.

在讨论这样的问题时,Linux IPC技术使用某些人提到了性能问题.除了两倍慢的因素外,您是否看到性能问题?您是否看到阻止dbus在嵌入式系统中使用的问题?

据我所知,dbus是否适用于小消息.如果需要传递大量数据,其中一个解决方案是将数据放入共享内存或堆中,然后使用dbus进行通知.根据所讨论的其他ipc机制正在考虑的是:信号,匿名管道,命名管道或FIFO,SysV消息队列,POSIX消息队列,SysV共享内存,POSIX共享内存,SysV信号量,POSIX信号量,FUTEX锁,文件 - 支持和匿名共享内存使用mmap,UNIX域套接字,Netlink套接字,网络套接字,Inotify机制,FUSE子系统,D-Bus子系统.

我应该提一个列出要求的问题(尽管它以apache为中心):

  • 分组/消息导向
  • 能够处理点对点和一对多通信
  • 没有层次结构,没有服务器和客户端
  • 如果一个端点崩溃,则必须通知其他端点
  • 来自现有Linux发行版的良好支持
  • 为了创建动态页面,Apache存在"绑定" - 这个太具体了,在一般的嵌入式dbus使用讨论中可以忽略它

然而,关于性能的另一个问题,所以提到的技术来提高性能.考虑到这一切,我想在嵌入式系统中使用dbus时应该有更少的问题或缺点.

embedded performance ipc dbus c-api

8
推荐指数
1
解决办法
4041
查看次数

优化Lua嵌入式处理器?

我将Lua嵌入到带有16Mhz 32位ARM7TDMI处理器和256Kb RAM的无eabi设备的程序中(是的,那是GBA).目前它正在完美运行(谢谢StackOveflow用户,回答我的问题),做简单的任务,但我可以做些什么来提高整体效率呢?这是我的一些想法:

  • 目前我将我的Lua代码存储为常量字符串数组(单独的ROM最高为32Mb,因此它有助于释放RAM).当我想运行它时,我只需将此字符串推送到Lua堆栈并"填充"它.但据我所知,Lua将该代码构建为RAM中的字节代码.我认为这也可能是大Lua文件的一些问题.任何方式 - 预编译该字节码并将其保存到常量容器中?

  • 哪个asm命令集更适合运行Lua-THUMB或ARM?

编辑:也许,将香草Lua改为LuaJIT?据我所知,LuaJIT有许多代码组装线(这使得它的可移植性降低),是否有机会成功构建旧的ARM7处理器?

c lua c-api

7
推荐指数
0
解决办法
245
查看次数

"你好TensorFlow!" 使用C API

出于学习目的,如何使用TensorFlow C API对此Python示例进行编码?

import tensorflow as tf
hello = tf.constant("hello TensorFlow!")
sess=tf.Session()
print(sess.run(hello))
Run Code Online (Sandbox Code Playgroud)

我这样试过:

#include <string.h>
#include <iostream.h>
#include "c_api.h"

int main( int argc, char ** argv ) 
{
  TF_Graph * graph = TF_NewGraph();
  TF_SessionOptions * options = TF_NewSessionOptions();
  TF_Status * status = TF_NewStatus();
  TF_Session * session = TF_NewSession( graph, options, status );
  char hello[] = "Hello TensorFlow!";
  TF_Tensor * tensor = TF_AllocateTensor( TF_STRING, 0, 0, 8 + TF_StringEncodedSize( strlen( hello ) ) );
  TF_OperationDescription * operationDescription = TF_NewOperation( graph, …
Run Code Online (Sandbox Code Playgroud)

dll c-api tensorflow

7
推荐指数
2
解决办法
5855
查看次数

DBus同步调用超时

我有一个 DBus 服务器,它公开了一个需要大量时间才能完成的方法(大约 3 分钟)。客户端对此方法执行同步调用。

问题是,正好 25 秒后,客户端抛出错误,因为“没有收到回复”。

不幸的是,我无法更改客户端,因此我无法使调用异步,因为它应该是。

我试图在我的服务器配置中使用这一行:

<limit name = "reply_timeout">240000</limit>
Run Code Online (Sandbox Code Playgroud)

但情况没有改变。

任何的想法?

c dbus glib c-api

5
推荐指数
1
解决办法
5584
查看次数

numpy C API 中的 import_array 如何工作?

我正在尝试将 c++ 中的 c 样式数组转换为 numpy 数组,并在尝试使用“PyArray_SimpleNewFromData”函数时遇到问题。原来我需要打电话

import_array()
Run Code Online (Sandbox Code Playgroud)

虽然我不明白如何调用这个函数。每当我尝试调用它时,我都会收到我无法理解的编译器错误。例如编写以下简单脚本:

#include <Python.h>
#include <numpy/arrayobject.h>

int main(){
    Py_Initialize();
    import_array();
    Py_Finalize();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生编译器错误

错误:返回语句没有值,在返回 'int' 的函数中 [-fpermissive] import_array();

我看了几个例子,例如:

Numpy C-Api 示例给出了 SegFault

PyArray_SimpleNewFromData 示例

https://codereview.stackexchange.com/questions/92266/sending-ac-array-to-python-numpy-and-back

编译多个模块时出现 import_array() 的 Numpy/CAPI 错误

但无论我尝试什么(即使看似遵循这些示例),我似乎都会遇到上面的编译器错误。我错过了什么或做错了什么?关于如何调用 import_array() 函数的解释将非常受欢迎。谢谢您的帮助!

更新:

我正在使用 python 2.7.11,我认为它可能与这里讨论的内容有关:

https://github.com/clemenscorny/brisk/issues/3

但我仍然不知道如何解决它。

c++ python numpy c-api

5
推荐指数
1
解决办法
2675
查看次数

在 c_api 中使用 TF_GraphImportGraphDef 时,Tensorflow 2.2.0 保存的模型中的 GraphDef 无效

我通过以下方式在 Python 中的 tf 2.2.0 中保存了 keras 模型:

model.save('model', save_format='tf')
Run Code Online (Sandbox Code Playgroud)

它在“model”目录中给了我一个saved_model.pb。我想通过 c_api 进行推理,并且使用以下函数的代码: TF_LoadSessionFromSavedModel 工作正常。

int main() {
    TF_Graph *Graph = TF_NewGraph();
    TF_Status *Status = TF_NewStatus();
    TF_SessionOptions *SessionOpts = TF_NewSessionOptions();
    TF_Buffer *RunOpts = NULL;

    const char *saved_model_dir = "model/";
    const char *tags = "serve";

    int ntags = 1;
    TF_Session *Session = TF_LoadSessionFromSavedModel(SessionOpts, RunOpts, saved_model_dir, &tags, ntags, Graph, NULL, Status);

    if (TF_GetCode(Status) == TF_OK)
    {
        printf("TF_LoadSessionFromSavedModel OK\n");
    }
    else
    {
        printf("%s", TF_Message(Status));
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我想通过 TF_GraphImportGraphDef 直接使用“model”目录中的 saving_model.pb,则会出现“Invalid GraphDef”错误: …

inference c-api tensorflow

5
推荐指数
0
解决办法
1022
查看次数

我们如何从python访问PY_SSIZE_T_MAX值?

我在python代码中,需要检查一些值PY_SSIZE_T_MAX(在python的C-API中定义)。

我可以PY_SSIZE_T_MAX直接获得价值吗?如果没有,由于python的行为,有没有办法推断它?还是我可以安全地从中推断出来sizeof(ctypes.c_ssize_t)(我正在考虑的价值:)2**(8 * sizeof(c_ssize_t) - 1)

python ctypes c-api

4
推荐指数
1
解决办法
334
查看次数