'da hem R hem de numpy kullanan C kodunu derlemek Cümlenin hem numpy hem de R'yi kullanan bazı C kodları var. Windows'da, MSVC'yi R'den dinamik olarak yüklenebilen ve tüm testleri geçebilen bir .dll ile derler. Bununla birlikte, Debian üzerinde çalışmayı başaramıyorum.Linux
aşağıdaki minimal imsi örneğini oluşturdu sorunu araştırmak için:
#include <Python.h>
#include <Rinternals.h>
#include <numpy/arrayobject.h>
SEXP main() {
Py_Initialize();
import_array();
SEXP one = PROTECT(allocVector(INTSXP, 1));
INTEGER(one)[0] = 1;
npy_intp dims[1] = {1};
int data[1] = {1};
PyObject *another = PyArray_SimpleNewFromData(1, dims, NPY_INT, data);
Rprintf("Hello, %d ", INTEGER(one)[0] + *(int*)PyArray_DATA(another));
PyRun_SimpleString("print('worlds')");
UNPROTECT(1);
return one;
}
Ben Rdll.lib
pexports R.dll > R.exp
link /lib /def:R.exp /machine:x64 /out:Rdll.lib
ile
%R_HOME%\bin\x64\R.dll
oluşturuldu
cl /I "C:\Program Files\R\R-3.2.0\include" /I "C:\Python34\include" /I "C:\Python34\Lib\site-packages\numpy\core\include" /c hello.c
link /dll /export:main hello.obj Rdll.lib C:/Python34/libs/python34.lib
ile derlemek olabilir Sonra
o R kullanılabilir:
> dyn.load(paste0("hello", .Platform$dynlib.ext))
> .Call("main")
Hello, 2 worlds
[1] 1
ancak,
gcc -shared -fPIC -I/usr/share/R/include -I/usr/include/python2.6 -lpython2.6 -L/usr/lib64/R/lib -lR hello.c -o hello.so
ile Debian üzerinde derlemek ve şu olur R içe,:
> dyn.load("hello.so")
> .Call("main")
Traceback (most recent call last):
File "/usr/lib/pymodules/python2.6/numpy/__init__.py", line 132, in <module>
import add_newdocs
File "/usr/lib/pymodules/python2.6/numpy/add_newdocs.py", line 9, in <module>
from lib import add_newdoc
File "/usr/lib/pymodules/python2.6/numpy/lib/__init__.py", line 4, in <module>
from type_check import *
File "/usr/lib/pymodules/python2.6/numpy/lib/type_check.py", line 8, in <module>
import numpy.core.numeric as _nx
File "/usr/lib/pymodules/python2.6/numpy/core/__init__.py", line 5, in <module>
import multiarray
ImportError: /usr/lib/pymodules/python2.6/numpy/core/multiarray.so: undefined symbol: _Py_ZeroStruct
*** caught segfault ***
address 0x4, cause 'memory not mapped'
Numune ile ilgili her şey yorumlanmadığı sürece segmentasyon hataları üretir. R'den saf Python ile etkileşim iyi görünüyor. Ancak import_array()
çağrıldığında, bir segfault var. -I/usr/share/pyshared/numpy/core/include/
çaresizliğini ekledim ve hiçbir şey değiştirmedi. Ben
gcc -I/usr/share/R/include -I/usr/include/python2.6 -lpython2.6 -L/usr/lib64/R/lib -lR hello.c -o hello
ile aynı Debian makinede (önceki benzer, ama biraz değişti) Aşağıdaki kodu
#include <Python.h>
#include <Rinternals.h>
#include <numpy/arrayobject.h>
int main() {
char *localArgs[] = {"R", "--silent"};
Rf_initEmbeddedR(2, localArgs);
Py_Initialize();
import_array();
SEXP one = PROTECT(allocVector(INTSXP, 1));
INTEGER(one)[0] = 1;
npy_intp dims[1] = {1};
int data[1] = {1};
PyObject *another = PyArray_SimpleNewFromData(1, dims, NPY_INT, data);
Rprintf("Hello, %d ", INTEGER(one)[0] + *(int*)PyArray_DATA(another));
PyRun_SimpleString("print('worlds')");
UNPROTECT(1);
}
derlemek eğer
Son olarak, ve
ile diyoruzLD_LIBRARY_PATH=/usr/lib64/R/lib R_HOME=/usr/lib64/R ./hello
it aniden çökmez, iyi çalışır ve beklendiği gibi "Merhaba, 2 dünya" üretir.
sürümleri şunlardır: Pencereler: x64 için Derleyici Versiyon 19.00.23506, Python 3.4.4, numpy 1.9.3 R 3.2.0 Debian: gcc sürüm 4.4.5 (hedef: x68_64-linux-gnu) , Python 2.6.6, sayı 1.4.1, R 3.2.1
Neyi yanlış yapıyorum?
Güncelleme: Hem Python 3.2 hem de Python 2.7 ile hem gcc hem de clang ile Ubuntu üzerinde test edilmiştir. Sorun devam ediyor.