2017-04-09 7 views
0

私はあなたの助けが必要です!C++から別のファイルで定義されたPython関数を呼び出す方法は?

どのように私はC言語でPythonの関数を呼び出すことができ++次の.pyソースに基づく:

DefineEasyCalls.py

def myfun(): 
    return 100 

Testfile.py

from DefineEasyCalls import * 
fun = myfun() 

私が使用したいです私のC + +プログラムのInputfileとしてTestfile.py。そこに、私はmyfun()を呼び出して、何かをしたいと思います。あなたはこれを達成するためのアイデアを持っていますか?たぶん私は両方のファイルをC++でインポートし、Testfile.pyがmyfunというメソッドであり、testfile.pyファイルから対応する関数を呼び出すのかどうかを確認しますが、Testfile.pyにmyfunの関数入力がある場合はどうなりますか?その場合、この戦略は私にとっては役に立たないでしょう。

私がTestfile.pyに直接myfunを定義している場合(Testfile.py = DefineEasyCalls.pyのコード)、Testfile.pyでコードを実行するよりも、しかし、私はDefineEasyCalls.pyではなく、入力ファイルとしてTestfile.pyを使用したい!さらに、私はまた、私はまた、後でC + +で使用するいくつかの入力引数をTestfile.pyにmyfunを与えたいと思います。誰かにこれをどうやって考えさせるか?私はMSVC2015とPython 3.6を使用し

#include <Python.h> 
#include <stdlib.h> 
#include <iostream> 
using namespace std; 

int callmyfun(); 

int main() 
{ 
    int a = callmyfun(); 
    int b = 1; 
    cout << a+b << endl; 
    cin.get(); 
    return 0; 
} 


int callmyfun() 
{ 
PyObject *pName, *pModule, *pDict, *pFunc; 
PyObject *pValue; 

Py_Initialize(); 

PyObject* sysPath = PySys_GetObject("path"); 
PyList_Append(sysPath, PyBytes_FromString("C:/ .. path .../x64/Release")); 

// Load the module 
pName = PyUnicode_DecodeFSDefault("Testfile"); 
pModule = PyImport_Import(pName); 
Py_DECREF(pName); 

cout << pName << endl; 

if (pModule != NULL) 
{ 
    cout << "module found\n"; 
    pDict = PyModule_GetDict(pModule); 
    pFunc = PyObject_GetAttrString(pModule, "myfun"); 

    if (pFunc != NULL) { 
     pValue = PyObject_CallObject(pFunc, NULL); 
     printf("Result of call: %ld\n", PyLong_AsLong(pValue)); 
     Py_DECREF(pValue); 
     long long L = PyLong_AsLongLong(pValue); 
     return L; 
    } 
    else { 
     std::cout << "Couldn't find func\n"; 
     return 0; 
    } 
} 
else 
{ 
    cout << "module not found!\n"; 
    return 0; 
} 

    Py_Finalize(); 
} 

は、ここに私のC++コードです。ご協力ありがとうございました!

+0

さらに、私は例えばmyfun(10)をC++のTestfile.pyから呼び出すことができますか? – stevula

答えて

0

私に役立つ解決策が見つかりました! :)

  • Testfile.py
  • にPython拡張モジュールを介し
の機能を呼び出し
  • (iはSWIGを使用)Python拡張モジュールを作成し、所望の機能
  • を含有するC++クラスを作成

    もう一つの方法は、DefineEasyCalls.pyをモジュールディレクトリのロードパスに入れ、このファイルをTestfile.pyにインポートすることですが、これは私のためには機能しませんでした。ここでは、私はc apiがpythonモジュール(numpyなど)を検索するパスを見つけることができませんでした。たぶん、誰かがこの考え方をする方法を知っているのでしょうか?

  • 関連する問題