如何在 Linux 中从 C 执行 Python 程序
How to execute a Python program from C in Linux
我正在使用 Raspberry Pi,我需要能够在我的 C 程序完成 运行 函数后执行 python 程序。我一直在尝试使用 fork 和 exec,但是,当我使用 "python3" 作为 exec 函数的第一个参数时,我得到的只是控制台中的 python 命令提示符。
回答问题:
OP 使用 execlp
或类似形式,形式为:
execlp("python3", "name_of_script.py", (char*)0);
(或者如果他们不知道 the issue with NULL
,他们可能已经通过了 NULL
而不是 (char*)0
)。
问题是,execlp
usually needs the first argument to be passed twice;第二次是将值设置为 argv[0]
,而用户提供的参数几乎总是在 argv[1]
和更高版本中检查(argv[0]
中的值很少使用,当它是,它主要用于 usage/debug 输出)。当 python3
看到它自己的 argv
时,它看到它是用 name_of_script.py
的 "name" 调用的,但它不认为它是真正的 "argument" , 所以它的行为就好像它是在没有参数的情况下启动的,这导致了交互式解释器。
修复方法是两次传递程序名称,一次是为了查找程序,一次是在 argv
中设置它,因此参数被 python3
识别为要调用的脚本:
execlp("python3", "python3", "name_of_script.py", (char*)0);
// ^ program to find
// ^ name to set in argv[0]
// ^ script name to put in argv[1] so script is run
我正在使用 Raspberry Pi,我需要能够在我的 C 程序完成 运行 函数后执行 python 程序。我一直在尝试使用 fork 和 exec,但是,当我使用 "python3" 作为 exec 函数的第一个参数时,我得到的只是控制台中的 python 命令提示符。
回答问题
OP 使用 execlp
或类似形式,形式为:
execlp("python3", "name_of_script.py", (char*)0);
(或者如果他们不知道 the issue with NULL
,他们可能已经通过了 NULL
而不是 (char*)0
)。
问题是,execlp
usually needs the first argument to be passed twice;第二次是将值设置为 argv[0]
,而用户提供的参数几乎总是在 argv[1]
和更高版本中检查(argv[0]
中的值很少使用,当它是,它主要用于 usage/debug 输出)。当 python3
看到它自己的 argv
时,它看到它是用 name_of_script.py
的 "name" 调用的,但它不认为它是真正的 "argument" , 所以它的行为就好像它是在没有参数的情况下启动的,这导致了交互式解释器。
修复方法是两次传递程序名称,一次是为了查找程序,一次是在 argv
中设置它,因此参数被 python3
识别为要调用的脚本:
execlp("python3", "python3", "name_of_script.py", (char*)0);
// ^ program to find
// ^ name to set in argv[0]
// ^ script name to put in argv[1] so script is run