C调用Python崩溃的记录

  也不确定哪里出了问题。

  根据目前了解的情况,出错原因如下:

  1. 新产生一个数组缓冲区。
  2. 产生调用Python的数组参数。
  3. 销毁该缓冲区。
  4. 调用Python函数。

  这时发现这个缓冲区已经销毁了,于是出错了。

  正确做法是,3、4颠倒。

  参考《C向Python传递数组参数时,调用函数后才能销毁》。

  

#0  0x00007f474329b984 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
[Current thread is 1 (Thread 0x7f470affd700 (LWP 31868))]
(gdb)
(gdb) backtrace
#0  0x00007f474329b984 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#1  0x00007f4743324106 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#2  0x00007f47432a01a7 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#3  0x00007f47432a0e3b in _PyObject_GC_Malloc ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#4  0x00007f47432903eb in PyType_GenericAlloc ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#5  0x00007f4608204ab8 in THPVariable_NewWithVar (type=<optimized out>,
    var=...) at torch/csrc/autograd/python_variable.cpp:48
#6  0x00007f4608206659 in THPVariable_Wrap (var=...)
    at torch/csrc/autograd/python_variable.cpp:75
#7  0x00007f460820dcbc in torch::autograd::utils::wrap (tensor=...)
    at /pytorch/torch/csrc/autograd/utils/wrap_outputs.h:18
#8  torch::autograd::THPVariable_getitem (self=0x7f45b015f370,
    index=0x7f4690018a58)
    at torch/csrc/autograd/python_variable_indexing.cpp:292
#9  0x00007f47432739fd in PyEval_EvalFrameEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#10 0x00007f47433af11c in PyEval_EvalCodeEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
---Type <return> to continue, or q <return> to quit---
#11 0x00007f47433053b0 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#12 0x00007f47432d82b3 in PyObject_Call ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#13 0x00007f474324474a in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#14 0x00007f47432d7afb in PyIter_Next ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#15 0x00007f474327b593 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#16 0x00007f47432799b1 in PyEval_EvalFrameEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#17 0x00007f47433af11c in PyEval_EvalCodeEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#18 0x00007f4743277f5d in PyEval_EvalFrameEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#19 0x00007f47433af11c in PyEval_EvalCodeEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#20 0x00007f47433053b0 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#21 0x00007f47432d82b3 in PyObject_Call ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#22 0x00007f474334c46c in ?? ()
---Type <return> to continue, or q <return> to quit---
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#23 0x00007f47432d82b3 in PyObject_Call ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#24 0x00007f47432f9535 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#25 0x00007f47432d82b3 in PyObject_Call ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#26 0x00007f474327639c in PyEval_EvalFrameEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#27 0x00007f47433af11c in PyEval_EvalCodeEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#28 0x00007f47433053b0 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#29 0x00007f47432d82b3 in PyObject_Call ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#30 0x00007f474334c46c in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#31 0x00007f47432d82b3 in PyObject_Call ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#32 0x00007f47432f9535 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#33 0x00007f47432d82b3 in PyObject_Call ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
---Type <return> to continue, or q <return> to quit---
#34 0x00007f474327639c in PyEval_EvalFrameEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#35 0x00007f47433af11c in PyEval_EvalCodeEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#36 0x00007f4743277f5d in PyEval_EvalFrameEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#37 0x00007f47433af11c in PyEval_EvalCodeEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#38 0x00007f47433053b0 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#39 0x00007f47432d82b3 in PyObject_Call ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#40 0x00007f474334c46c in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#41 0x00007f47432d82b3 in PyObject_Call ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#42 0x00007f47432f9535 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#43 0x00007f47432d82b3 in PyObject_Call ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#44 0x00007f474327639c in PyEval_EvalFrameEx ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#45 0x00007f47433af11c in PyEval_EvalCodeEx ()
---Type <return> to continue, or q <return> to quit---
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#46 0x00007f47433053b0 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#47 0x00007f47432d82b3 in PyObject_Call ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#48 0x00007f47433ae547 in PyEval_CallObjectWithKeywords ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#49 0x00007f4746ae7342 in PythonClass::python_function (this=0x7f46900008c0,


 

C语言是一种高级编程语言,而Python也是一种高级编程语言。在C语言中调用Python程序可以通过使用Python的解释器来实现。要在C语言中调用Python程序,首先需要在C中包含Python的头文件,以便可以使用Python的函数和数据结构。 在C代码中,可以使用Py_Initialize()函数来初始化Python解释器。然后可以使用PyRun_SimpleString()函数或PyRun_SimpleFile()函数来执行Python代码。这样可以将C语言中的数据传递给Python程序进行处理,并获取Python的返回结果。 此外,还可以使用PyImport_ImportModule()函数来导入Python模块,并使用PyObject_CallObject()函数来调用Python函数。通过这些函数的使用,可以在C语言中直接调用Python函数。 在调用Python程序之前,需要先确保Python解释器已经安装在计算机上,并且路径已正确配置好。可以通过设置环境变量或在代码中指定Python解释器的路径来实现。 需要注意的是,在调用Python程序时,C语言和Python存储数据的方式是不同的。所以在C语言和Python之间传递数据时,需要进行数据类型的转换。可以使用PyArg_ParseTuple()函数来将C语言的数据类型转换为Python的数据类型,或使用Py_BuildValue()函数将Python的数据类型转换为C语言的数据类型。 总之,通过上述方法,我们可以在C语言中调用Python程序,实现C语言和Python的互操作。这样可以充分利用C语言的性能和Python的灵活性,来开发更加复杂和强大的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳鲲鹏

能给阁下一点帮助,非常荣幸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值