信号 SIGSEGV:当我使用 go-python3 时,分段违规代码 = 0x1

Posted

技术标签:

【中文标题】信号 SIGSEGV:当我使用 go-python3 时,分段违规代码 = 0x1【英文标题】:signal SIGSEGV: segmentation violation code=0x1 when i use go-python3 【发布时间】:2021-08-17 12:58:56 【问题描述】:

当我尝试执行我的代码两次时出现错误“分段违规”,我不知道如何解决这个问题...:/

   func (a *MyActivity) Eval(context activity.Context) (done bool, err error) 

    pinString := context.GetInput("input1").(string)
    // string to int
    pinInt, _ := strconv.Atoi(pinString)

    //defer python3.Py_Finalize()
    python3.Py_Finalize()
    python3.Py_Initialize()
    if !python3.Py_IsInitialized() 
        fmt.Println("Error initializing the python interpreter")
        os.Exit(1)
    

    dir, err := filepath.Abs(filepath.Dir("./"))
    if err != nil 
        //log.Fatal(err)
        fmt.Println(err)
    

    ret := python3.PyRun_SimpleString("import sys\nsys.path.append(\"" + dir + "\")")
    if ret != 0 
        //log.Fatalf("error appending '%s' to python sys.path", dir)
        fmt.Println("error appending to python sys.path" + dir)
    
    // Here is the problem \\
    oImport = python3.PyImport_ImportModule("detect") //ret val: new ref
    if !(oImport != nil && python3.PyErr_Occurred() == nil) 
        python3.PyErr_Print()
        //log.Fatal("failed to import module 'detect'")
        fmt.Println("failed to import module 'detect'")
    
    // Here is the problem \\
     .
     .
     .
     .

我尝试了很多东西,但我无法解决问题,使用库 go-python3 对我来说是新的

非常感谢您的帮助:)

【问题讨论】:

如果你愿意,我也可以发布 python 代码,但它很短我认为不是问题 ***.com/q/7676314/1256452(还有***.com/q/67533541/1256452)——或多或少是“你搞错了”的变体 谢谢伙计,我在 Golang 中尝试了函数 init() 并将我的导入和 Py_Initialize() 放入其中,它现在可以工作了...... :) 【参考方案1】:

在我的函数 Eval 之前,我用 Golang 中的函数 init() 解决了这个问题。 我将所有导入以及 python3.Py_Finalize() 和 python3.Py_Initialize() 放入 init() 函数中,它对我有用:)

【讨论】:

在调用initialize之前不要调用finalize函数;由于您是在 init 函数中执行此操作,因此您根本不应该调用 finalize。 (理想情况下,您应该在“正确的时间”在您的应用退出时调用 finalize 一次。不幸的是,通常不可能找到“正确的时间”——因此您往往是最好的根本没有调用它,这本身也很不幸:通常会因缺乏适当的关闭而产生连锁反应。

以上是关于信号 SIGSEGV:当我使用 go-python3 时,分段违规代码 = 0x1的主要内容,如果未能解决你的问题,请参考以下文章

程序接收信号 SIGSEGV,ASM 中使用 SHRD 的分段错误

致命信号 11 (SIGSEGV) 在 0x00000000 (code=1) - PhoneGap

Android Studio Emulator崩溃:进程以退出代码139结束(由信号11中断:SIGSEGV)

原生Android应用程序中的SIGSEGV错误

如何使用 SIGSEGV 的信号处理程序调试程序

使用 mixChannels 函数 (opencv) 时的“致命信号 11 (SIGSEGV),代码 1”