c++から Pythonの関数を実行したいのです
(できれば Pythonをインストールしていない環境でも実行できるように)
とりあえず、Web検索で見つけた
Python.h をインクルードし、PyObject_CallObject()関数を使用した
プログラムをコンパイルしました
しかし、実行すると
Fatal Python error: Py_Initialize: unable to load the file system codec
Import Error: No module named 'encodings'
のエラーが出ました
そこで Pythonのlibフォルダ内のファイルを EXEファイルのあるフォルダーにコピーし、
実行可能となりましたが もっと スマートな 解決方法は ありませんでしょうか?
また 上記方法は Pythonが ない環境で 動作させることは 可能でしょうか?
追記:
環境
python 3.5.3 (Version)
Windows 7 64bit
試したコード
c++
1#include<stdio.h> 2#include<Python.h> 3#include<string> 4#include<iostream> 5 6 7int main(){ 8 PyObject *pName,*pModule, *pTmp, *pFunc; 9 PyObject *pArgs, *pValue; 10 double res_data; 11 double a = 10.5; 12 13 //最初に必ず入れる 14 Py_Initialize(); 15 16 //カレントディレクトリを探す範囲にいれる------------------------- 17 PyObject *sys = PyImport_ImportModule("sys"); 18 PyObject *path = PyObject_GetAttrString(sys, "path"); 19 PyList_Append(path,PyUnicode_DecodeFSDefault(".")); 20 //--------------------------------------------------------------- 21 22 //探すファイルをしてい------------------------------------------- 23 pName = PyUnicode_DecodeFSDefault("py_test2"); 24 pModule = PyImport_Import(pName); 25 Py_DECREF(pName); 26 //--------------------------------------------------------------- 27 28 //タプルの作成 ----------------------------------------------- 29 pArgs = PyTuple_New(1);//タプルを新しく作成する 30 pValue = PyFloat_FromDouble(a);//pValueにaの数値を設定 31 PyTuple_SetItem(pArgs,0,pValue);//タプルの0の位置にpValueを設定 32 //--------------------------------------------------------------- 33 34 if(pModule != NULL){ 35 36 //pFuncに今回呼び出す関数を設定する(今回はfunc) 37 pFunc = PyObject_GetAttrString(pModule, "func"); 38 39 //pFuncを引数を与える(pArgsはタプルでなければならない) 40 pTmp = PyObject_CallObject(pFunc, pArgs); 41 42 //関数を実行 d:double型を受け取る 43 PyArg_Parse(pTmp, "d", &res_data); 44 printf("%f\n",res_data); 45 } 46 //最後に必ず入れる 47 Py_Finalize(); 48 49 return 0; 50}
Python
1#py_test2.py 2 3import random 4def func(data): 5 print("hogehoge") 6 a = data 7 print(a) 8 list_data = [14,2,3.5,28] 9 list_data.append(a) 10 b = random.choice(list_data) 11 return b
回答2件
あなたの回答
tips
プレビュー