使用参数运行python脚本

发布于 2021-01-29 19:11:24

我想从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(..)方法的方法。

关注者
0
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    似乎您正在使用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代码传递这些args:

    //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端捕获args,但是那只是基本的想法。

    希望能帮助到你!



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看