2016-09-22 7 views
-1

私はmpmathの特殊関数にCコードからアクセスしたいと思います。 私は中間のpythonスクリプトを使ってそれを行う方法を知っています。例えば 、超幾何関数を評価するために、Cプログラム:mpmath関数を呼び出す方法がありますCpmから直接mpmathを呼び出す

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

#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スクリプトを呼び出すことにより、すべての作品中間のpythonスクリプトに頼ることなく、Cから直接hyp2f1? mpmathモジュールは、コマンド

PyRun_SimpleString("from mpmath import *"); 

でインポートすることができることを私は推測しかし、どのように私は、実際の機能にアクセスできますか?

+0

Cプログラムを書くなら、Pythonの代わりにCの任意精度の算術ライブラリを使ってみませんか? – user2357112

+0

待ちます。あなたが書いたコードはすでにPythonモジュールをインポートし、そのモジュールで定義されている関数にアクセスし、引数をパックして関数を呼び出します。これは、あなたが仕事を遂行するために必要なすべてのツールを既に知っていることを意味します。ラッパーモジュールを書くのではなく、なぜそれらのツールを 'mpmath'モジュールに直接適用しなかったのですか? – user2357112

+0

_ラッパーモジュールを書く代わりに、これらのツールをmpmathモジュールに直接適用したのはなぜですか?_ – rgaelzer

答えて

0

何ですか?いいえ!文字通り、名前を変更しただけで、 GGauss_2F1.Gauss_2F1にアクセスしたことを行います。なぜあなたはPyRun_SimpleString( "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); 
} 

コードは期待通りに機能しているようで、正しい結果が得られています。 "忍耐"ありがとう...

関連する問題