[M1 Mac, Big Sur 11.6.5, Python 3.10.4]
前回まではPythonスクリプトの埋め込みについて調べていましたが、ついにモジュール化に成功しました。
埋め込みでは処理が一方通行だったのが、モジュール化により双方向でデータのやり取りができるようになります。Pythonスクリプトを1行ずつバラして埋め込む必要がなくなるのでだいぶ楽です。
今回のケースでは、Pythonスクリプトで作成したリストをC++コードが文字列として受け取り、Fl_Multiline_Outputに表示させています。
現段階では実行ファイルでしかできませんが、早くappファイルでもできるようにしたいところです。appファイルでは実行ボタンを押すとなぜか落ちてしまいます。
なお.bash_profileにてPYTHONPATHを設定しないとPythonスクリプトを読み込めないので要注意です。
#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>
using std::string;
string XlsxToList(const char* path) {
Py_Initialize();
// pyファイルの指定(test.py)
PyObject* myModuleString = PyUnicode_FromString((char*)"test");
// pyファイルのモジュール化
PyObject* myModule = PyImport_Import(myModuleString);
// pyファイル内の関数を指定
PyObject* myFunction = PyObject_GetAttrString(myModule,(char*)"xlsx_to_list");
// 関数の引数を設定
PyObject* args = PyTuple_Pack(1,PyUnicode_FromString(path));
// 関数を実行し戻り値をPyObjectとして取得
PyObject* myResult = PyObject_CallObject(myFunction,args);
// PyObjectをconst char*に変換
const char* result = PyUnicode_AsUTF8(myResult);
return string(result);
Py_Finalize();
}
import openpyxl
def xlsx_to_list(path):
wb = openpyxl.load_workbook(path)
ws = wb.worksheets[0]
color_name = []
for cell in ws['A']:
color_name.append(cell.value)
return str(color_name)
<該当箇所のみ>
void xtol(){
const char *path = input_line->value();
string result = XlsxToList(path);
output_line->insert(result.c_str());
}
# pyファイルのあるディレクトリを指定
export PYTHONPATH="/Python/library/python_module"