Python が埋め込まれた R 拡張機能を構築しています。
Pythonが必要なエンコーディングを見つけることができないことを除いて、すべてがうまくいきます。「big5」に関係することをすると、LookupError がスローされ続けます。ただし、スタンドアロンの C++ アプリケーションをビルドすると、Python インタープリターはエンコーディングを検出し、エラーのスローを停止します。
test.cpp
c の通常のスタンドアローンの例:
#include <Python.h>
int main(int argc, char* argv[]) {
Py_SetProgramName("test"); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString(
"import codecs\n"
"f = codecs.open('big5_encoded_file', encoding='big5', mode='r')"
);
Py_Finalize();
return 0;
}
testr.cpp
R 拡張の場合:
#include <R.h>
#include <Rdefines.h>
#include <Python.h>
extern "C" SEXP testpy();
SEXP testpy() {
Py_SetProgramName("test"); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString(
"import codecs\n"
"f = codecs.open('big5_encoded_file', encoding='big5', mode='r')"
);
Py_Finalize();
return R_NilValue;
}
Makefile
Ubuntu 12.10の場合:
all: test testr.so
test: test.cpp
g++ test.cpp -o test -I/usr/include/python2.7 -lpython2.7
testr.so: testr.cpp
R CMD SHLIB testr.cpp
は./test
正常に実行されますがRscript -e "dyn.load('testr.so');.Call('testpy')"
、「LookupError: unknown encoding: big5」が生成されます
ありがとう
- 編集 -
をビルドするには、次のようtestr.so
に設定してください。
export PKG_CXXFLAGS=-I/usr/include/python2.7
export PKG_LIBS=-lpython2.7