[M1 Mac, Big Sur 11.6.5, Python 3.10.4]
デバッグ用コードを走らせ、実行内容をチェックしました。
sysPath 6個に対してGetPath 3個となっており、pathを追加できていないだけでなく数も合っていません。
つまりsys.pathとPython/C APIのmodule search pathは一致しないということが判明しました。集合で表現するとmodule search path ⊂ sys.pathになります。
module search pathの設定がPy_SetPath()やPYTHONPATH以外の方法でできないとなると、これ以上の追究は厳しくなります。
#define PY_SSIZE_T_CLEAN
#include "process.h"
#include </Library/Frameworks/Python.framework/Versions/3.10/include/python3.10/Python.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#define PATH L"/Python/library/python_module:/Library/Frameworks/Python.framework/Versions/3.10/lib/python310.zip:/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10:/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/lib-dynload"
using std::string;
string XlsxToList(const char* path) {
// Py_SetPath(PATH);
Py_Initialize();
// PyObject* sysPath = PySys_GetObject("path");
PyObject* sys = PyImport_ImportModule( "sys" );
PyObject* sysPath = PyObject_GetAttrString( sys, "path" );
std::cout << "追加前path数 " << PyList_Size(sysPath) << std::endl;
std::cout << "PyObject* sysPath通過" << std::endl;
PyObject* module_path = PyUnicode_FromString("/Python/library/python_module");
std::cout << "PyObject* module_path通過" << std::endl;
int append_bool = PyList_Append(sysPath, module_path);
std::cout << "PyList_Append通過" << std::endl;
std::cout << append_bool << std::endl;
std::cout << "追加後path数 " << PyList_Size(sysPath) << std::endl;
// module search pathを出力し、パスの内容と個数を確認
std::wcout << Py_GetPath() << std::endl;
// pyファイルのモジュール化
PyObject* myModule = PyImport_ImportModule((char*)"test");
std::cout << "myModule通過" << std::endl;
const char* function = "xlsx_to_list";
int attr_bool = PyObject_HasAttrString(myModule,function);
std::cout << "attr_bool通過" << std::endl;
std::cout << attr_bool << std::endl;
// pyファイル内の関数を指定 ここでエラー発生
PyObject* myFunction = PyObject_GetAttrString(myModule,function);
// 関数の引数を設定
PyObject* args = PyTuple_Pack(1,PyUnicode_FromString(path));
// 関数を実行し戻り値をPyObjectとして取得
PyObject* myResult = PyObject_CallObject(myFunction,args);
// PyObjectをconst char*に変換
const char* result = PyUnicode_AsUTF8(myResult);
std::cout << result << std::endl;
return result;
Py_FinalizeEx();
}
--------------------------------------------------
出力
--------------------------------------------------
追加前path数 5
PyObject* sysPath通過
PyObject* module_path通過
PyList_Append通過
0
追加後path数 6
/Library/Frameworks/Python.framework/Versions/3.10/lib/python310.zip:/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10:/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/lib-dynload
myModule通過
attr_bool通過
0
Segmentation fault: 11