【问题标题】:Pass command line arguments to python 2.7.6 package application using C API使用 C API 将命令行参数传递给 python 2.7.6 包应用程序
【发布时间】:2014-01-28 22:35:48
【问题描述】:

我是 python 新手,现在我需要使用它的 C API 调用 python 2.7.6 程序。

python 程序采用python package 的形式,并采用多个命令行选项。你可以这样运行它:

python my_py_app input.txt --option1="value1" --option2="value2"

这是我一直在做的事情:

1、使用Py_Initialize()设置python API;

2,使用PyImport_ImportModule("my_py_app")加载该包,它返回一个有效的PyObject

3,我不知道该怎么做……

python C API 文档包含许多函数,例如PyEval_CallXXX。我需要调用哪一个?如何将选项/值对传递给程序?

【问题讨论】:

    标签: python python-2.7 python-c-api


    【解决方案1】:

    您正在寻找PySys_SetArgv 函数。

    以下问题有更多信息和示例:

    Run a python script with arguments


    $ find
    .
    ./py.c
    ./mymod
    ./mymod/__init__.py
    ./mymod/__main__.py
    $ cat ./mymod/__init__.py
    $ cat ./mymod/__main__.py
    import sys
    
    print 'hello', ' '.join(sys.argv[1:])
    $ python mymod world
    hello world
    $ cat ./py.c
    #include <stdio.h>
    #include <python2.7/Python.h>
    
    int main(void)
    {
        int argc;
        char * argv[2];
    
        argc = 2;
        argv[0] = "mymod";
        argv[1] = "world";
    
        Py_SetProgramName(argv[0]);
        Py_Initialize();
        PySys_SetArgv(argc, argv);
        PyImport_ImportModule("mymod.__main__");
        Py_Finalize();
    
        return 0;
    }
    $ gcc `python2.7-config --cflags --ldflags` py.c
    $ ./a.out
    hello world
    $
    

    【讨论】:

    • 谢谢,在发布我的问题之前,我已经检查了这个问题。问题是 my_py_app 不是一个 py 文件,它是一个 python 包(文件夹),所以那里的答案似乎不适用于我。
    • 当然可以。如果该软件包按照您的问题显示为sys.argv,那么您正在寻找该功能。
    • 假设我已经使用 PySys_SetArgv 设置了参数,但下一步是什么?在您给出的问题中,有 FILE* file = fopen("mypy.py","r"); PyRun_SimpleFile(文件,“mypy.py”);但我没有文件,所以我似乎无法调用 PyRun...
    • 如果你调用那个函数然后像你已经做的那样导入模块,它应该给模块参数并且它应该工作。如果没有,您始终可以创建一个包装包的小脚本,并使用其他问题中的示例代码调用它。
    • 我添加了一个完整的例子。
    猜你喜欢
    • 1970-01-01
    • 2020-01-01
    • 2010-10-04
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多