将许多数据从Python传递到C程序

Mak*_*s_F 7 c python dll parameter-passing

我有一个python脚本和一个C程序(我写了两个,所以我有源).我需要从python脚本传递大量数据,这些数据调用C程序很多次.现在我让用户选择用ascii文件或二进制文件传递它们,但两者都很慢而且没用(我的意思是,如果你想存储数据,文件是有用的,但我删除了这些文件的末尾剧本).os.system不起作用,参数太多了.(C程序也使用文件将数据返回到python,但这个数据要少得多)

我想知道我可以用什么来快速进行这种交换.将文件写入ram磁盘?如果是这样,我该怎么做?

我听说可以使用ctypes从dll调用函数,但不知道如何将我的程序编译为dll(我在win 7 64上使用wxdevc ++).或包装它,但仍然不知道它是否可以工作,如果它是有效的..

谁能告诉我怎么能这样做?

(数据是3d网格的顶点)

编辑:也许更多的信息可能有所帮助.我在另一个程序(blender(开源))中运行python脚本,并且被调用多次(通常超过500次)因为它在一个循环中.脚本将顶点信息(1个int索引和3个浮点coords)发送到程序,程序应该返回许多顶点(只有int索引,因为我可以用python找到相应的顶点).所以这不是交互式的,它更像是一个函数(但它是用C语言编写的).我正在编写的脚本+ C程序(它是blender的附加组件)应该是跨平台的,因为它将被重新分配(我将给出源代码和编译程序).也许这个注释可以帮助:程序实际上是用C语言编写的,而从python我可以知道包含顶点数据的结构的内存中的地址.如果我知道如何做到这一点,最好只传递给C程序一个地址,并从那里找到所有其他顶点(存储在列表中).但据我所知,我无法访问另一个程序的内存空间,我不知道是否使用管道调用程序或任何初始化新线程或在脚本内运行(实际上是在Blender线程)Ps:这里的源和here(3)应该是struct定义

(3):blender/source/blender/makesdna/DNA_meshdata_types.h

sen*_*rle 8

管道是显而易见的方式; 如果你的c程序接受来自stdin的输入,你可以使用Popen.这不会像您在编辑中所说的那样创建"线程"; 它创建了一个具有独立内存的全新流程:

from subprocess import Popen, PIPE

input = "some input"
cproc = Popen("c_prog", stdin=PIPE, stdout=PIPE)
out, err = cproc.communicate(input)
Run Code Online (Sandbox Code Playgroud)

这是一个更详细的例子.首先,一个简单的c程序回应stdin:

#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);
}
Run Code Online (Sandbox Code Playgroud)

然后一个python程序管道输入(在这种情况下从argv)到上面:

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
Run Code Online (Sandbox Code Playgroud)

但是,如果您不打算在没有python前端的情况下使用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)
Run Code Online (Sandbox Code Playgroud)

正如Joe指出的那样,你也可以在c:用C或C++扩展Python中编写一个python模块

这个答案讨论了组合c和python的其他方法:如何连接Python和C程序?

编辑:根据您的编辑,听起来你真的应该创建一个cpython扩展.如果你想要一些示例代码,请告诉我; 但是一个完整的解释会导致一个不合理的长期答案.请参阅上面的链接(扩展Python ...),了解您需要了解的所有内容.