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

2つのオプションがあります。

  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")
    

    その方法を理解したら、PythonAPIを使用してCコードから直接関数を呼び出すことができます。

于 2012-08-27T12:51:53.997 に答える