问题描述
我有一个Python脚本和一个C程序,我需要从多次调用C程序的Python脚本传递大量数据。现在,我让用户在传递ASCII文件或二进制文件之间进行选择,但这两种文件都很慢,而且毫无用处(我的意思是,如果您想存储数据,文件很有用,但我在脚本末尾删除了这些文件)。os.system
不起作用,参数太多,因为C程序也使用文件将数据返回到Python,但这是少得多的数据。
我想知道我可以用什么来快速交换。要将文件写入RAM磁盘吗?如果是,我如何才能做到这一点?
我听说可以使用ctype从DLL调用函数,但不知道如何将我的程序编译为DLL(我在Windows 7 64上使用wxdevc+)。 或者包装它,但仍然不知道它是否可以工作,是否有效。
数据是3D网格的顶点。
我在另一个程序(blender(开放源码))中运行Python脚本,因为它在一个循环中,所以被多次调用(通常超过500次)。脚本向程序发送顶点信息(1int
索引和3个浮点坐标),程序应该返回很多顶点(只返回int索引,因为我可以用Python找到对应的顶点)。
所以这不是交互式的,它更像是一个函数(但它是用C语言编写的)。我正在编写的脚本+C程序(BLENDER的附加组件)应该是跨平台的,因为它将被重新分发。
程序实际上是用C语言编写的,从Python中我可以知道包含顶点数据的结构在内存中的地址。如果我知道如何做到这一点,最好只将一个地址传递给C程序,然后从那里找到所有其他顶点(存储在列表中)。
但据我所知,我不能访问另一个程序的内存空间,我不知道是用管道或其他什么方法调用程序初始化新线程还是在脚本内运行(实际上是在Blder线程下运行)
Here is the source和blender/source/blender/makesdna/DNA_meshdata_types.h
应为结构定义
推荐答案
管道是显而易见的方法;如果您的c程序接受来自stdin的输入,则可以使用Popen
。这不会创建您在编辑中所说的"线程";它会创建一个具有独立内存的全新进程:
from subprocess import Popen, PIPE
input = "some input"
cproc = Popen("c_prog", stdin=PIPE, stdout=PIPE)
out, err = cproc.communicate(input)
这里有一个更详细的示例。首先,是一个响应stdin的简单c程序:
#include<stdio.h>
#include<stdlib.h>
#define BUFMAX 100
int main() {
char buffer[BUFMAX + 1];
char *bp = buffer;
int c;
FILE *in;
while (EOF != (c = fgetc(stdin)) && (bp - buffer) < BUFMAX) {
*bp++ = c;
}
*bp = 0; // Null-terminate the string
printf("%s", buffer);
}
然后是一个通过管道将输入(在本例中是从argv)输送到上面:
的python程序:from subprocess import Popen, PIPE
from sys import argv
input = ' '.join(argv[1:])
if not input: input = "no arguments given"
cproc = Popen("./c_prog", stdin=PIPE, stdout=PIPE)
out, err = cproc.communicate(input)
print "output:", out
print "errors:", err
如果您不打算在没有python前端的情况下使用c程序,那么您最好内联一个c函数,也许可以使用instant
。
from instant import inline
c_code = """
[ ... some c code ... ] //see the below page for a more complete example.
"""
c_func = inline(c_code)
正如Joe指出的,您还可以用c:Extending Python with C or C++
编写一个python模块此答案讨论了组合c和python的其他方法:How do I connect a Python and a C program?
编辑:根据您的编辑,听起来您确实应该创建一个cpython扩展。如果您想要一些示例代码,请让我知道;但完整的解释可能会导致答案不合理地冗长。请参阅上面的链接(扩展Python...)你需要知道的一切。
这篇关于将许多数据从Python传递到C程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!