2

我正在构建一个 R 扩展,其中包含一个嵌入式 python。

现在一切顺利,除了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;
}

MakefileUbuntu 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:未知编码:big5 ”

谢谢

- 编辑 -

要构建testr.so,请设置:

export PKG_CXXFLAGS=-I/usr/include/python2.7
export PKG_LIBS=-lpython2.7
4

1 回答 1

0

我注意到这是一个链接问题。

我试图import encodings.big5在嵌入式python中,但发生了错误undefined referencehttp://bugs.python.org/issue4434中的解决方案对我有用:

PyInitialize()我打电话之前dlopen("libpython2.7.so", RTLD_LAZY | RTLD_GLOBAL);

于 2013-03-02T16:33:09.587 回答