我想在C中使用PyPy和cffi嵌入Python函數。我正在關注PyPy文檔中的this guide。如何嵌入一個使用cffi在C中返回字符串的Python函數?
問題是,我找到的所有例子都是在int上進行操作的,我的函數接受一個字符串並返回一個字符串。我似乎無法弄清楚如何在C中嵌入這個函數,因爲C似乎並沒有真正的字符串,而是使用了字符數組。
這是我已經試過:
# interface.py
import cffi
ffi = cffi.FFI()
ffi.cdef('''
struct API {
char (*generate_cool_page)(char url[]);
};
''')
...
@ffi.callback("char[] (char[])")
def generate_cool_page(url):
# do some processing with BS4
return str(soup)
def fill_api(ptr):
global api
api = ffi.cast("struct API*", ptr)
api.generate_cool_page = generate_cool_page
-
// c_tests.c
#include "PyPy.h"
#include <stdio.h>
#include <stdlib.h>
struct API {
char (*generate_cool_page)(char url[]);
};
struct API api; /* global var */
int initialize_api(void)
{
static char source[] =
"import sys; sys.path.insert(0, '.'); "
"import interface; interface.fill_api(c_argument)";
int res;
rpython_startup_code();
res = pypy_setup_home(NULL, 1);
if (res) {
fprintf(stderr, "Error setting pypy home!\n");
return -1;
}
res = pypy_execute_source_ptr(source, &api);
if (res) {
fprintf(stderr, "Error calling pypy_execute_source_ptr!\n");
return -1;
}
return 0;
}
int main(void)
{
if (initialize_api() < 0)
return 1;
printf(api.generate_cool_page("https://example.com"));
return 0;
}
當我運行gcc -I/opt/pypy3/include -Wno-write-strings c_tests.c -L/opt/pypy3/bin -lpypy3-c -g -o c_tests
然後運行./c_tests
,我得到這個錯誤:
debug: OperationError:
debug: operror-type: CDefError
debug: operror-value: cannot render the type <char()(char *)>: it is a function type, not a pointer-to-function type
Error calling pypy_execute_source_ptr!
我不在C語言方面沒有太多的經驗,我覺得我誤表了字符串參數/返回值UE。我如何正確地做到這一點?
感謝您的幫助!
感謝您指出我正確的文檔 - 我會嘗試了這一點! – TheInitializer
你確定我不需要'initialize_api()'嗎? GCC給我'未定義的引用'generate_cool_page'。 (我已經包含'plugin.h') – TheInitializer
仔細閱讀如何編譯,在我鏈接的頁面上。對於兩種不同的用例有兩種選擇。看起來你並沒有遵循這些選項...... –