Запустите скрипт Python с аргументами

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

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

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

-m is the list containing the target ip-addresses. -s is the directory that contains the files to be synced. -t is the directory on the target machines where the files will be put.

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

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

Это отлично работает. Тем не менее, я не могу найти, как я могу передать эти аргументыPyRun_SimpleFile(..) метод.

Ответы на вопрос(2)

Call

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

in your C code.

Actually use the API that mrsync (hopefully) defines. This is more flexible, but much more complicated. The first step would be to work out how you would perform the above operation as a Python function call. If mrsync has been written nicely, there will be a function mrsync.sync (say) that you call as

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

Once you've worked out how to do that, you can call the function directly from the C code using the Python API.

 27 авг. 2012 г., 16:53
На самом деле, возможно, можно инициализировать интерпретатор с помощью argv и затем запустить его в файле. Вы должны попробовать и посмотреть, хотя, я не знаю.
 29 авг. 2012 г., 21:55
Вариант 1 работает только в предположении, что «python» гарантированно находится в системном пути
 Bram W.27 авг. 2012 г., 16:36
+1 Ваш первый метод действительно работает, спасибо вам за это. Однако мне все еще любопытно узнать, не может ли это быть достигнуто с помощью интерпретатора Python, который я описал в своем первом посте. Ваш второй метод, к сожалению, не будет работать в этой ситуации, потому что mrsync не предоставляет API.
 04 сент. 2012 г., 11:46
Использование системной функции всегда вызывает у меня негативную реакцию. Строка, предоставленная системе, подлежит интерпретации оболочки, и, следовательно, эта функция довольно опасна. Правильный способ выполнения команд из C в системах POSIX - это функции exec *. Таким образом: execlp ("python", "python", "mrsync.py", "-m", ..., "/ tmp / targettdata", NULL); Если вы хотите создать ссылку на конкретного интерпретатора Python, вы можете использовать ответ Майка. Тем не менее, обратите внимание, что если вы обновите python, ваше приложение сломается намного проще, что не всегда происходит при использовании только exec.
Решение Вопроса

вы ищете ответ, используя 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. но это только основная идея.

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

 20 апр. 2016 г., 08:06
Я пересмотрел этот пример - в то время как CPython, кажется, используетargc также я все еще используюNULL указатель в конце самостоятельно построенныйargvкак в стандарте Cargv.
 12 янв. 2014 г., 10:41
Здравствуйте, @Mike, не могли бы вы взглянуть на эту ситуацию, когда мне нужно передать аргументы в пакетное приложение python (а не просто в py-файл):stackoverflow.com/questions/21036106/…
 11 июл. 2013 г., 17:12
Обратите внимание, что в Python 3 вам сначала нужно преобразовать в широкие символы (wchar_t). Для этого попробуйте mbstowcs_s (#include & lt; stdlib.h & gt;).
 13 янв. 2014 г., 18:22
@JayZ - Извините, только что вернулся сегодня, похоже, вы получили ответ по другой ссылке, но если вам нужна дополнительная помощь, дайте мне знать.

Ваш ответ на вопрос