使用Python C API两次调用C函数时出现分段错误
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用Python C API两次调用C函数时出现分段错误,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2025字,纯文字阅读大概需要3分钟。
内容图文
![使用Python C API两次调用C函数时出现分段错误](/upload/InfoBanner/zyjiaocheng/796/ed9f75995a9f45dc82bdf6e6ff420b3f.jpg)
最近我想使用C包装器从Fortran调用Python(参见here).下面我发布一个更简单的例子.函数的第二次调用导致pModule = PyImport_Import(pName)处的分段错误.我发现问题是来自scipy.optimize导入牛顿线 – 如果我评论它一切正常.任何想法如何解决它?
rootC.c
#include "rootC.h"
#include <Python.h>
void root_(double* A, double* B, double* t, double* x)
{
PyObject *pName, *pModule, *pFunc;
PyObject *pArgs, *pValue, *sys, *path;
Py_Initialize();
sys = PyImport_ImportModule("sys");
path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyString_FromString("."));
pName = PyString_FromString("rootPY");
pModule = PyImport_Import(pName);
if (!pModule)
{
PyErr_Print();
printf("ERROR in pModule\n");
exit(1);
}
pFunc = PyObject_GetAttrString(pModule, "root");
pArgs = PyTuple_New(3);
PyTuple_SetItem(pArgs, 0, PyFloat_FromDouble((*A)));
PyTuple_SetItem(pArgs, 1, PyFloat_FromDouble((*B)));
PyTuple_SetItem(pArgs, 2, PyFloat_FromDouble((*t)));
pValue = PyObject_CallObject(pFunc, pArgs);
*x = PyFloat_AsDouble(pValue);
Py_Finalize();
}
rootC.h
#ifndef ROOT_H_
#define ROOT_H_
void root_(double*, double*, double*, double*);
#endif
rootPY.py
from mpmath import polylog, exp
from scipy.optimize import newton
def root(A,B,t):
return 1
main.c中
#include "rootC.h"
#include <stdio.h>
int main()
{
double A = 0.4, B = 0.3, t = 0.1, x = 0.0;
root_(&A,&B,&t,&x);
printf("x = %.15f\n", x);
root_(&A,&B,&t,&x);
printf("x = %.15f\n", x);
return 0;
}
Makefile文件
CC = gcc
FC = gfortran
CFLAGS = -I/usr/include/python2.7
LFLAGS = -L/usr/local/lib -lpython2.7 -lm
.PHONY: all clean
all: main
main: main.o rootC.o
$(CC) $^ -o $@ $(LFLAGS)
main.o: main.c
$(CC) $(CFLAGS) -c $< -o $@
rootC.o: rootC.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f *.o
解决方法:
人们也可以这样做:
#include "rootC.h"
#include <Python.h>
#include <stdlib.h>
void Initialize ()
{
Py_Initialize();
}
void Finalize ()
{
Py_Finalize();
}
void root_(double* A, double* B, double* t, double* x)
{
PyObject *pName, *pModule, *pFunc;
PyObject *pArgs, *pValue, *sys, *path;
static int i;
if (i == 0)
{
++i;
Initialize();
atexit(Finalize);
}
....
}
内容总结
以上是互联网集市为您收集整理的使用Python C API两次调用C函数时出现分段错误全部内容,希望文章能够帮你解决使用Python C API两次调用C函数时出现分段错误所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。