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