【问题标题】:How to execute a Python program from C in Linux如何在 Linux 中从 C 语言执行 Python 程序
【发布时间】:2019-02-16 07:57:37
【问题描述】:

我使用的是 Raspberry Pi,我需要能够在我的 C 程序完成运行函数后执行 python 程序。我一直在尝试使用 fork 和 exec,但是,当我使用“python3”作为 exec 函数的第一个参数时,我得到的只是控制台中的 python 命令提示符。

【问题讨论】:

  • 请显示您尝试过的代码。
  • 预测:您要运行的 Python 脚本不带参数,并且您未能将 python3 两次传递给 execl* 函数之一,或者未能将其作为 @ 的第一个元素传递987654323@ 用于execv* 函数之一,因此它最终将命令解释为“运行python3 不带参数,只需告诉它与我的脚本同名”,而不是“运行python3 在它自己的名称,以我的脚本为参数”。
  • @ShadowRanger 两次python3都没通过,非常感谢。
  • 我同意@ShadowRanger 的观点,在没有额外信息的情况下,除了预测之外很难做更多的事情。我要补充一点,这取决于您如何调用 shell,如果您实际上 正在 将 python 脚本的路径作为第二个参数传递,那么您可能位于错误的工作目录中并且它将无法找到脚本——让控制台挂起。祝你好运!

标签: python c python-3.x raspberry-pi exec


【解决方案1】:

回答问题as determined in the comments

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]中的值很少使用,当它是时,它主要是为了使用/调试输出)。当python3 看到它自己的argv 时,它看到它是用name_of_script.py 的“名称”调用的,但它并不认为它是一个真正的“参数”,所以它的行为就好像它是用没有参数,这会导致交互式解释器。

解决方法是传递程序名称两次,一次用于查找程序,一次将其设置在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多