防止Python脚本中调用的C函数输出重复数据

c0vxltue  于 2023-06-28  发布在  Python
关注(0)|答案(1)|浏览(78)

我有一个python脚本,可以执行编译后的C程序。目前,从C程序到Python脚本的数据交换是使用printf完成的。
我的整个项目开始增长,从.py和.c本身调用.c函数。这导致我用printf和return结束一些.c函数(如下面的read())。

// This function read a value from a path
char*
read(char* hostname, int port, char* path)
{
    // the data read is attributed to dataValue
    char* dataValue = "test"

    // print the result to be captured from the .py when the function is directly called
    printf("%s", dataValue);

    // return the result for the .c function
    return dataValue;
}

// This function call read() for each path of a list
function1(char* hostname, int port, char** pathArray, int pathArrayCount) {
    for (int i = 0; i < pathArrayCount; i++) {
        printf("\nReading data of %s\n", hostname);
        result = read(hostname, port, pathArray[i]);
        printf("\ndata = %s", result);
    }
}

read()通过.py执行时,printf的输出被捕获,并以格式良好的结果进行处理。

result = subprocess.run(['./program.c', 'read()', arg1, arg2, arg3], capture_output=True, text=True)
output : result.stdout.strip()
print("output : \n",output)

# *calling read()*
# output :
# test

但是当执行function1()并调用read()时,read()中的printf出现在终端中,我最终在终端中得到原始数据和格式良好的数据。

result = subprocess.run(['./program.c', 'function1()', arg1, arg2, arg3, arg4], capture_output=True, text=True)
output : result.stdout.strip()
print("output : \n",output)

# *calling read()*
# output :
# Reading data of localhost
# test
# data = test

当我调用function1时,我想要的输出是:

output :
Reading data of localhost
data = test

我该如何预防这种情况?我的想法是检测.c函数是否被另一个.c函数调用,并跳过printf,但我不知道这是否可行。

0qx6xfy6

0qx6xfy61#

没有函数both打印值并返回它们!只有由命令行参数选择的顶级客户端才应该打印任何内容(无论是为用户还是为其他进程使用)。您可能最终得到read_print调用read并打印结果,以及function1_print调用function1(多次调用read并返回结果列表)并打印结果,但实际上这只是比您已经拥有的代码稍微多一点。
还可以考虑将你的C程序变成Python扩展,这样你就可以直接调用其中的函数,而不必将文本输出重新解析为C中已经可用的相同值。(如果您仍然需要该程序用于其他目的,请使它和扩展共享一个实际产生数据的库。

相关问题