Подтвердить что ты не робот

Запустите python script с аргументами

Я хочу вызвать Python script из C, передав некоторые аргументы, необходимые в script.

script Я хочу использовать mrsync или удаленную синхронизацию многоадресной передачи. Я получил эту работу из командной строки, позвонив:

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

-m - это список, содержащий целевые ip-адреса. -s - это каталог, содержащий файлы для синхронизации. -t - это каталог на целевых компьютерах, где будут помещаться файлы.

До сих пор мне удалось запустить Python script без параметров, используя следующую программу C:

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

Это прекрасно работает. Однако я не могу найти способ передать этот аргумент методу PyRun_SimpleFile(..).

4b9b3361

Ответ 1

Похоже, вы ищете ответ, используя API-интерфейсы разработки python из Python.h. Вот пример для вас, который должен работать:

#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, но это просто основная идея.

Надеюсь, что это поможет!

Ответ 2

У вас есть два варианта.

  • Вызов

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

    в вашем коде C.

  • Собственно используйте API, который определяет mrsync (надеюсь). Это более гибко, но гораздо сложнее. Первым шагом будет выработка того, как вы выполняете вышеуказанную операцию как вызов функции Python. Если mrsync было написано красиво, будет функция mrsync.sync (скажем), которую вы называете

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

    Как только вы это разработали, вы можете вызвать функцию непосредственно из кода C с помощью API Python.