2016-09-22 46 views
-1

我想從C代碼訪問mpmath的特殊功能。 我知道如何通過中間的python腳本來完成它。 例如,爲了評價超幾何函數,C程序:直接從C調用mpmath

#include <Python.h> 

void main (int argc, char *argv[]) 
{ 
    int npars= 4; 
    double a1, a2, b1, x, res; 
    PyObject *pName, *pModule, *pFunc, *pArgs, *pValue; 
    PyObject *pa1, *pa2, *pb1, *px; 

    a1= atof(argv[1]); 
    a2= atof(argv[2]); 
    b1= atof(argv[3]); 
    x= atof(argv[4]); 

    setenv("PYTHONPATH", ".", 1); // Set PYTHONPATH TO bin directory 
    Py_Initialize(); 

    pa1= PyFloat_FromDouble(a1); 
    pa2= PyFloat_FromDouble(a2); 
    pb1= PyFloat_FromDouble(b1); 
    px= PyFloat_FromDouble(x); 
    pName = PyString_FromString("GGauss_2F1"); 
    pModule = PyImport_Import(pName); 
    pFunc = PyObject_GetAttrString(pModule, "Gauss_2F1"); 
    pArgs = PyTuple_Pack(npars, pa1, pa2, pb1, px); 
    pValue = PyObject_CallObject(pFunc, pArgs); 

    res= PyFloat_AsDouble(pValue); 
    printf("2F1(x)= %.15f\n", res); 
} 

工作的很好的通過調用GGauss_2F1.py腳本:

from mpmath import * 
def Gauss_2F1(a1, a2, b1, z): 
    hpg= hyp2f1(a1, a2, b1, z) 
    return hpg 

有沒有辦法來調用mpmath功能hyp2f1直接來自C,而不必求助於中間的python腳本? 我猜測,mpmath模塊可以通過在命令

PyRun_SimpleString("from mpmath import *"); 

進口,但我怎麼訪問實際的功能?

+0

如果您正在編寫C程序,爲什麼不使用C任意精度算術庫而不是Python? – user2357112

+0

等一下。你編寫的代碼已經導入了一個Python模塊,訪問在該模塊中定義的函數,打包參數並調用函數。這意味着您已經知道完成工作所需的所有工具。你爲什麼不直接將這些工具應用到'mpmath'模塊而不是編寫一個包裝模塊? – user2357112

+0

_你爲什麼不直接將這些工具應用到mpmath模塊而不是寫包裝模塊?_ – rgaelzer

回答

0

什麼?沒有!從字面上看,你所做的事情只是在名稱改變的情況下訪問 GGauss_2F1.Gauss_2F1。你爲什麼試圖 到PyRun_SimpleString(「from mpmath import *」)? - user2357112

好的。遵循以下建議:

#include <Python.h> 

void main (int argc, char *argv[]) 
{ 
    int npars= 4; 
    double a1, a2, b1, x, res; 
    PyObject *pName, *pModule, *pFunc, *pArgs, *pValue; 
    PyObject *pa1, *pa2, *pb1, *px; 

    a1= atof(argv[1]); 
    a2= atof(argv[2]); 
    b1= atof(argv[3]); 
    x= atof(argv[4]); 

    setenv("PYTHONPATH", ".", 1); // Set PYTHONPATH TO bin directory 
    Py_Initialize(); 

    pa1= PyFloat_FromDouble(a1); 
    pa2= PyFloat_FromDouble(a2); 
    pb1= PyFloat_FromDouble(b1); 
    px= PyFloat_FromDouble(x); 
    pName = PyString_FromString("mpmath"); 
    pModule = PyImport_Import(pName); 
    pFunc = PyObject_GetAttrString(pModule, "hyp2f1"); 
    pArgs = PyTuple_Pack(npars, pa1, pa2, pb1, px); 
    pValue = PyObject_CallObject(pFunc, pArgs); 

    res= PyFloat_AsDouble(pValue); 
    printf("2F1(x)= %.15f\n", res); 
} 

該代碼似乎按預期工作並正在生成正確的結果。 感謝您的「耐心」......