2011-02-10 35 views
6

我有一個python腳本和一個C程序(我寫了他們兩個,所以我有源代碼)。 我需要從多次調用C程序的python腳本傳遞大量數據。現在我讓用戶選擇將它們傳遞給ascii文件還是二進制文件,但兩者都非常緩慢且無用(我的意思是,如果要存儲數據,文件是有用的,但是我在最後刪除這些文件劇本)。 os.system不起作用,參數太多。 (C程序也使用文件將數據返回給python,但是這是更少的數據)將許多數據從Python傳遞到C程序

我想知道我可以用什麼來快速交換數據。將文件寫入RAM磁盤?如果是這樣,我該怎麼做?

我聽說可以使用ctypes從dll調用函數,但不知道如何將我的程序編譯爲dll(我在win 7 64上使用wxdevC++)。 或包裝它,但仍不知道它是否可以工作,如果它是有效的..

有人可以告訴我我怎麼能做到這一點?

(該數據是3D網格的頂點)

編輯: 也許更多的相關信息可能會有幫助。我在另一個程序(blender(開源))中運行python腳本,並且因爲它在一個循環中被調用多次(通常超過500次)。該腳本將頂點信息(1 int index和3 float coords)發送給程序,程序應該返回許多頂點(只有int索引,因爲我可以用python找到相應的頂點)。所以這不是交互式的,它更像是一個函數(但它是用C寫的)。腳本+ C程序(這是攪拌機的附件),我寫的應該是跨平臺的,因爲它將被重新分配(我會給源代碼和編譯的程序)。也許這個筆記可以提供幫助:程序實際上是用C語言編寫的,從python中我可以知道包含頂點數據的結構在內存中的地址。如果只有我知道如何做到這一點,應該更好地傳遞給C程序一個地址,並從那裏找到所有其他頂點(存儲在列表中)。但據我所知,我無法訪問另一個程序的內存空間,並且我不知道是否使用管道調用程序或任何初始化新線程或在腳本內部運行(實際運行Blender的線程) PS:here the source和這裏(3)應該是結構定義

(3):攪拌機/源/攪拌機/ makesdna/DNA_meshdata_types.h

回答

6

管道是明顯的路要走;如果你的c程序接受stdin的輸入,你可以使用Popen。這不會像您在編輯中所說的那樣創建「線索」;它創建了一個全新的過程與單獨的存儲器:

from subprocess import Popen, PIPE 

input = "some input" 
cproc = Popen("c_prog", stdin=PIPE, stdout=PIPE) 
out, err = cproc.communicate(input) 

這裏的一個更詳細的例子。首先,呼應一個簡單的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); 
} 

然後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 

如果你不打算使用不帶python前端的c程序,儘管如此,你可能更適合內聯ac函數,也許使用instant

from instant import inline 
c_code = """ 
    [ ... some c code ... ] //see the below page for a more complete example. 
""" 
c_func = inline(c_code) 

喬指出,你也可以寫在C Python模塊:Extending Python with C or C++

這個答案討論等方式來結合c和蟒蛇:How do I connect a Python and a C program?

編輯:根據您的編輯,這聽起來像你真的應該創建一個cpython擴展。如果你想要一些示例代碼,請告訴我。但是充分的解釋會導致一個不合理的長時間答案。查看上面的鏈接(擴展Python ...),瞭解您需要了解的所有內容。

+0

,我可以改變我想要的。因此,用管道溝通東西就像寫在標準輸入中一樣。 – 2011-02-10 21:18:22

4

如果您的操作系統支持,named pipes是文件替換的下降。

+0

命名管道只允許在UNIX(所以說,文檔)我寫的C程序 – 2011-02-10 21:17:19

1

下面是一個與其他人略有不同的想法:將您的C程序編寫爲Python模塊。 Here是你需要做的所有信息。然後,您可以在Python代碼和C代碼之間來回傳遞大量緩衝區。

0

我從來沒有滿意的連接python和C的答案,所以我寫了一個答案後,大量的研究和思考。

TEST.C

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    FILE *fp; 
    char path[1035]; 

    fp = popen("python3 output2.py", "r"); // Open the command for reading. 
    if (fp == NULL) { 
     printf("Failed to run command\n"); 
     exit(1); 
    } 

    while (fgets(path, sizeof(path), fp) != NULL) 
     printf("C received %s", path); // Read the output. 

    pclose(fp); // close 

    return 0; 
} 

output2.py

import time 
import os, sys 

i = 0 
while True : 
    print("%d" %(i), flush=True) 
    time.sleep(1) 
    i = i + 1 
相關問題