使用Linux中的system()调用从C调用Python

时间:2013-04-24 16:34:03

标签: python c

我使用Linux机器内的system()调用从C代码调用Python程序。 假设第一次调用Python程序通过打开文本文件并读取第1行来读取某些文本文件的前10行。现在,在第二次调用Python程序时,我想阅读接下来的10行11-在上次调用Python期间打开的同一文本文件中的20个文件,无需重新打开文件并从文件的第一行开始。在第三次调用Python程序期间,我希望能够读取相同文本文件的下一行10 - 30行而不重新打开文件并从文件的开头开始。这继续......

以下是示例代码

//This is C code
...
...
int initial_line_number, final_line_number
initial_line_number = 1;
final_line_number = 10;
for(i = 1; i <= 10; i++)
{
    system("python test.py initial_line_number, final_line_number"); //test.py reads a text     file from initial_line number to final_line_number
    initial_line_number += 10;
    final_line_number +=10;
}

可以这样做吗?最优雅的方式是什么?

3 个答案:

答案 0 :(得分:2)

不,如果不重新打开文件,就无法继续第二次通话。

每个system()调用将运行作为参数给出的程序,并将等待该进程死亡。因此,每次你都会得到一个新的孩子 - 没有(简单的)方法让第二个孩子在第一个离开的地方继续。

(可能有复杂的方法,你的第一个进程在后台启动一个Python进程,读取一些行并挂起;你直接启动的进程将终止。第二个调用可能会认识到Python进程仍然存在并告诉它继续。但这是一个棘手的编程 - 不值得努力。而且每个system()调用仍然会运行一个单独的进程并等待该进程死亡。)

答案 1 :(得分:1)

首先,您对system()的调用是错误的,您必须传递一个字符串。

其次,调用system()是不好的,而且不可移植。如果您真的想使用Python,可以使用Python C API:http://docs.python.org/2/c-api/

答案 2 :(得分:1)

在理论层面上,您可能希望使用带有python和c的DBus进行探索。 有一个python守护进程读取你的文件,然后从c,进行dbus调用,返回x行(你可以在dbus头中指定)。

这样,你可以保持python文件打开,只要你愿意和你不需要system()调用,这意味着你的程序会更安全。

(Dbus可以从用户和系统权限运行,因此只要您拥有权限,就不必从管理员级别运行程序。)