23

我想从 C 调用 Python 脚本,传递脚本中需要的一些参数。

我要使用的脚本是 mrsync 或多播远程同步。我通过调用以下命令从命令行得到了这个工作:

python mrsync.py -m /tmp/targets.list -s /tmp/sourcedata -t /tmp/targetdata

-m 是包含目标 IP 地址的列表。-s 是包含要同步的文件的目录。-t 是目标机器上将放置文件的目录。

到目前为止,我设法通过使用以下 C 程序运行了一个不带参数的 Python 脚本:

Py_Initialize();
FILE* file = fopen("/tmp/myfile.py", "r");
PyRun_SimpleFile(file, "/tmp/myfile.py");
Py_Finalize();

这工作正常。但是,我找不到如何将这些参数传递给PyRun_SimpleFile(..)方法。

4

2 回答 2

42

似乎您正在使用 Python.h 中的 python 开发 API 寻找答案。这是一个应该工作的例子:

#My python script called mypy.py
import sys

if len(sys.argv) != 2:
  sys.exit("Not enough args")
ca_one = str(sys.argv[1])
ca_two = str(sys.argv[2])

print "My command line args are " + ca_one + " and " + ca_two

然后是传递这些参数的 C 代码:

//My code file
#include <stdio.h>
#include <python2.7/Python.h>

void main()
{
    FILE* file;
    int argc;
    char * argv[3];

    argc = 3;
    argv[0] = "mypy.py";
    argv[1] = "-m";
    argv[2] = "/tmp/targets.list";

    Py_SetProgramName(argv[0]);
    Py_Initialize();
    PySys_SetArgv(argc, argv);
    file = fopen("mypy.py","r");
    PyRun_SimpleFile(file, "mypy.py");
    Py_Finalize();

    return;
}

如果您可以将参数传递给您的 C 函数,则此任务将变得更加容易:

void main(int argc, char *argv[])
{
    FILE* file;

    Py_SetProgramName(argv[0]);
    Py_Initialize();
    PySys_SetArgv(argc, argv);
    file = fopen("mypy.py","r");
    PyRun_SimpleFile(file, "mypy.py");
    Py_Finalize();

    return;
}

你可以直接通过这些。现在我的解决方案出于时间原因只使用了 2 个命令行参数,但是您可以对需要传递的所有 6 个参数使用相同的概念......当然还有更简洁的方法来捕获 python 端的参数,但是这只是基本的想法。

希望能帮助到你!

于 2012-08-29T19:42:51.827 回答
9

你有两个选择。

  1. 称呼

    system("python mrsync.py -m /tmp/targets.list -s /tmp/sourcedata -t /tmp/targetdata")
    

    在你的 C 代码中。

  2. 实际使用mrsync(希望)定义的 API。这更灵活,但更复杂。第一步是弄清楚如何将上述操作作为 Python 函数调用执行。如果mrsync写得很好,就会有一个函数mrsync.sync(比如说)你称之为

    mrsync.sync("/tmp/targets.list", "/tmp/sourcedata", "/tmp/targetdata")
    

    一旦确定了如何执行此操作,就可以使用 Python API 直接从 C 代码调用该函数。

于 2012-08-27T12:51:53.997 回答