问题标签 [c-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
50 浏览

python - 如果执行“someVariable['key'] = value”,会调用什么过程

我正在尝试为我的应用程序编写一个带有 C-API 的 python 接口。
我可以创建一个模块并添加过程并将它们导入 python 上下文中。然后我可以运行 python 脚本来访问模块和过程。

我想使用一个键来访问数据,例如:
module.someVar['key'] = value

print(module.someVar['key'])

然后我想在 C 代码的过程中使用密钥和数据。
pyTypeObject 中调用了什么过程?

编辑: SomeVar 是我必须创建的类型的变量。是的,在评论之后,它是一个类似字典的对象。似乎第一个答案指出了我正确的观点,我目前正在测试它。

0 投票
1 回答
487 浏览

python - 如何在C中获取python返回值?

我正在尝试将图像从 C 传递到 python 并将数组从 python 传递回 C 并获取其中的长度和数据。这是我的 Python 代码:

这是我的 C 代码:

问题是我得到了正确的大小,但我的数据只得到零。我哪里错了?

0 投票
1 回答
865 浏览

python - 如果给定一个初始化类为 PyObject,则从 C++ 调用 Python 类方法

我在 C++ 中有一个函数,它接收一个初始化的类作为 PyObject。python类是:

C++ 收到这个:

从 c++ 如何调用表达式对象的 get_source 方法?到目前为止,我已经阅读了 python c-api 文档并尝试了这样的事情:

并将结果转换为字符串,但这不起作用。

0 投票
0 回答
89 浏览

tensorflow - Valgrind 显示 TF_Session 泄漏

Valgrind 在 libtensorflow.so 中显示 Leak_DefinitelyLost。这是简单会话初始化的 Valgrind 消息:

该代码导致此泄漏:

请帮助了解我是否以及如何解决此问题。如果我使用泄漏消失禁用opencv,则仅当我链接opencv时才会出现此泄漏

0 投票
1 回答
105 浏览

python - 将散景加载到嵌入式 python dll 崩溃

python (3.7.3) 通过 C-API 嵌入到可执行文件中。当 Python 脚本加载了函数PyImport_Import() 并且脚本包含散景导入时,即from bokeh.plotting import figure加载过程因浮点异常而提前结束。

可执行文件是用 Delphi 编写的,但它的 python API 几乎与原始 C-API 相同。我已经加载了许多其他模块,没有任何问题。散景是第一个无法加载的。

调用Delphi程序,python dll已经加载到exe进程中

和python脚本

以下事件日志列出了加载到进程中的 dll,仅显示最后的条目 - 根据它们的命名判断 - 与图形功能相关。最后抛出错误。

0 投票
1 回答
95 浏览

c - 如何找出冻结的张量流图的正确输入和输出操作?

我收到了一个用 python 训练的神经网络,格式是冻结图 (.pb)。为了使用 C-API 进行推理(这种特殊情况需要),我需要找出图形的输入和输出操作的名称。显然,这些名称与培训期间的名称不同。该图有 1780 个操作,以下名称中包含“输入”或“输出”:

输入:

有没有办法找出冻结图的实际输入和输出操作?

0 投票
1 回答
755 浏览

tensorflow - Tensorflow 会自动使用多个 CPU 吗?

我编写了一些代码,使用 Tensorflow 的 C API(仅限 CPU)进行推理。它在集群节点上运行,我可以在其中访问 24 个 CPU 和 1 个 GPU。我不使用 GPU,因为稍后我需要仅在 CPU 上执行任务。

不知何故,每次我从另一个程序 (OpenFOAM) 调用 Tensorflow 代码时,Tensorflow 似乎都在所有并行化的 CPU 上运行。但是我没有做任何事情来导致这种行为。现在我想知道 Tensorflow 是否默认进行这种并行化?

提前问候和感谢!

0 投票
0 回答
27 浏览

python - 像 IDE 一样实现 python 脚本调试

我的应用程序使用用户可创建的 python 脚本与应用程序交互。我为此使用了python c API,因此使用了dll。我既不使用也不打算将 python.exe 本身部署给最终用户。为了使事情变得更加困难,我还想从内存中调用脚本,而不是从文件中调用。

我怎样才能实现这样的调试功能?我能找到的只有

这意味着调用 exe(=其他进程),并将脚本保存到文件中。此外,不幸的是,这会弹出另一个窗口。

API 中有一些 Py_* 调试方法,但我不知道如何正确实现它们,或者它们是否适合我的用例。

目前我认为要走的路是启动一个隐藏的调试器,以某种方式附加到 python 系统,然后读/写回与应用程序的通信。只是我没有起点。

0 投票
0 回答
153 浏览

c++ - Tensorflow 在 cpu 中分配的内存是二进制模型大小的 4 倍

我们从这里使用 tensorflow C API 版本 1.13.1 https://www.tensorflow.org/install/lang_c

我们的神经网络模型frozen_graph.pb大小为 230mb,采用MobileNet架构。当我们加载它时,tensorflow 在第一次会话运行时分配了大约 1.1 gb,然后内存分配减少到 ~900mb 并保持在这个值。

我们从这里尝试了图形转换工具 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md 来优化图形。但是只有量化似乎可以有效地减少模型大小和内存使用量。但有时我们不能使用它,因为量化会降低 15% 的模型精度。

正如我们目前认为的那样,减少模型大小且不会显着影响准确性的唯一方法是。

1)移动到另一个后端,如 MXNET 等......

2)使用知识蒸馏技术重新训练小模型。 https://arxiv.org/pdf/1503.02531.pdf

我们期望单个模型的内存分配不超过二进制大小的 150%。任何可接受的解决方案。谢谢你。

0 投票
0 回答
614 浏览

python - 将 Numpy 结构化数组转换为结构的 C 数组

我正在尝试从应用程序的 C 部分传递和访问在 Python 中创建的 Numpy 结构化数组。我想对此类数组进行的用法是从 Python 端创建数组,按我的意愿使用它(仍然来自 Python),然后对于重计算阶段,将数组传递给 C 模块(无副本,使用指针)以便在C端可以访问和修改数据。

在 Python 方面,我正在创建一个具有自定义dtype的 Numpy 结构化数组,如下所示,并将其传递给位于简单 C 扩展中的函数:

Python

如图所示,我正在创建一个键值数组,其中每个键代表一个 C 结构的“字段”,并且该字段的每个值都是一个浮点数。然后,在 C 端,我尝试通过以下方式获取数组:
- 首先使用PyArg_ParseTuple函数来检索对数组的引用
- 然后使用创建的虚拟 PyObjectPy_BuildValue来获取数组的 dtype 的表示(结构的类型) , 以后用PyArray_AsCArray

C

尽管如此,我在访问数据时不断收到 SEGFAULT 错误。深入研究错误,我发现数据没有像我想象的那样转换(转换没有正确完成)。
我试图通过传递一个简单元组数组而不是一个包含更多数组的元组数组来简化示例:

这似乎可行,我获得了简化结构的数组,每个只包含 3 个浮点数(每个字段一个)而不是 3 个浮点数数组。

我的疑问是:
- 我错过了什么吗?是否甚至可以将结构化的 numpy 数组(每个字段都有一个浮点数组)转换为 C 结构数组,以便每个 Python 字段都映射到 C 结构的字段?例如,particles[0].position_x[0]从 C 访问就像particles[0]['position_x'][0]从 Python 端访问一样。
- 这会创建任何副本吗?我正在尝试访问和修改 Python 从 C 分配的内存。