2

我正在使用system()Linux 机器内的调用从 C 代码调用 Python 程序。假设第一次调用 Python 程序通过打开文本文件并读取第 1-10 行来读取某个文本文件的前 10 行。现在在第二次调用 Python 程序期间,我想读取接下来的 10 行 11-在最后一次调用 Python 期间打开的相同文本文件的 20 个,无需重新打开文件并从文件的第一行开始。在第三次调用 Python 程序期间,我希望能够读取同一文本文件的下 10 行第 21 - 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;
}

这可以做到吗?最优雅的方法是什么?

4

3 回答 3

2

不,您不能在不重新打开文件的情况下继续第二次通话。

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

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

于 2013-04-24T16:41:21.860 回答
1

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

其次,通话system()不好,而且不便携。如果你真的想使用 Python,你可以使用 Python C API:http ://docs.python.org/2/c-api/

于 2013-04-24T16:37:58.287 回答
1

在理论上,您可能想探索将 DBus 与 python 和 c 一起使用。有一个 python 守护程序读取您的文件,然后从 c 进行 dbus 调用,返回 x 行数(您可以在 dbus 标头中指定)。

这样,您可以根据需要保持 python 文件打开,并且不需要 system() 调用,这意味着您的程序会更安全。

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

于 2013-04-24T16:50:46.270 回答