【问题标题】:How to terminate python script by C API [duplicate]如何通过C API终止python脚本[重复]
【发布时间】:2016-11-22 10:02:45
【问题描述】:

我想在我的应用程序中运行一些 python 脚本,但有时我想在脚本完成之前终止它,然后运行一些其他 python 脚本。

我目前使用PyRun_SimpleString(python_script) 运行脚本,但我不知道如何终止它。有人可以帮帮我吗?

【问题讨论】:

  • 您想什么时候停止脚本?你如何决定停止它?在调用 PyRun_SimpleString 之前脚本尚未启动,在调用 PyRun_SimpleString 之后脚本已经完成。
  • 在我的应用程序中,选择一个python脚本文件,并读取它的内容,然后调用 PyRun_SimpleString() 来运行它,但有时,用户可以通过按一个按钮停止这个脚本来终止脚本完成之前,我不知道如何终止它。如果使用pytho命令行运行脚本,我们可以使用CTRL+C来破解,但是如何使用python.dll API来破解,暂时还没有找到
  • @n.m.不能保证在 PyRun_SimpleString 返回之前所有线程都退出。有时您必须等到 python 解释器终止所有线程。我在旧的 XBMC 源代码 python 界面中观察到了这种行为。
  • @Fent 你的脚本可以在子进程中运行吗?
  • 你想要在 C 中这样做,因为这可以在 Python 中轻松完成吗?

标签: python c python-3.x python-c-api


【解决方案1】:

要从 C 程序中终止 python 脚本,您可以使用 python 脚本的名称(或其他一些正则表达式)找到它的进程 ID,然后终止该进程。

我的 C 有点生锈,但下面的代码会杀死一个正在运行的名为 test.py 的 Python 脚本。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main (void) {
    bool kill_python = true;

    if (kill_python == true) {
        FILE *cmd = popen("kill -9 $(ps aux | grep '[t]est.py' | awk '{print $2}')", "r");
        pclose(cmd);
    }

    return 0;
}

ps aux | grep '[t]est.py' | awk '{print $2}'返回python脚本的进程id kill -9 {PID} 强行杀死进程(-9 = non-catchable, non-ignorable kill)

【讨论】:

  • 这个答案本身并不能解决问题,但我有一个想法通过这个解决方案。请考虑这个问题,这不是他想要停止的“python 脚本”,而是当前没有 PID 的“python 脚本字符串”。他能做的是fork一个进程,一旦他想杀死python脚本,就杀死那个fork的进程。这样一来,我认为这是一个很好的方法,因此奖励了赏金。
  • 这个答案已经由@georgexsh 给出,抱歉我之前没有注意到。
猜你喜欢
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多