Ini mungkin pertanyaan sederhana, tetapi saya mengalami masalah dalam membuat _splitter.pyx menjadi _splitter.so (jadi saya dapat mencoba beberapa perubahan yang saya buat). Saat ini saya sedang mencoba membuat file asli dengan perintah:

cython -a _splitter.pyx

Dan itu menghasilkan kesalahan berikut:

Kesalahan saat mengkompilasi file Cython:

... self.index_to_samples, self.feature_values, end_negative, start_positive)

cdef int compare_SIZE_t(const void* a, const void* b) nogil:

^

_splitter.pyx:1008:34: Diharapkan ')', ditemukan '*'

Saya mencoba beberapa perubahan seperti:

cython -3 _splitter.pyx

Atau

cython -a _splitter.pyx _splitter.pxd

Tapi itu hanya menghasilkan lebih banyak kesalahan. Apakah saya melakukan sesuatu yang salah?

Ketika diperbaiki, saya berencana untuk menggunakan perintah:

gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -o _splitter.so _splitter.c

Apakah itu pendekatan yang benar?

Terima kasih banyak atas bantuannya

EDIT: Upgrade Cython saya ke versi 0.24. Sekarang saya mendapatkan kesalahan berikut di beberapa baris:

Kesalahan saat mengkompilasi file Cython:

... fitur[f_i], fitur[f_j] = fitur[f_j], fitur[f_i]

# Gambarkan ambang acak saat ini. ambang batas = rand_uniform(nilai_fitur_min, nilai_fitur_maks, status_acak)

^

_splitter.pyx:1547:65: Mengonversi ke objek Python tidak diizinkan tanpa gil

0
LuizF Gonçalves 25 Juli 2016, 20:59
Sepertinya kesalahan sintaks, mungkin ) hilang pada baris sebelumnya. Kita perlu melihat lebih banyak kode (di sekitar kesalahan).
 – 
hpaulj
25 Juli 2016, 22:40
Saya baru saja menyalin file asli dari github: github .com/scikit-learn/scikit-learn/blob/master/sklearn/tree/… Kesalahan ada pada baris 1008 dari file ini
 – 
LuizF Gonçalves
26 Juli 2016, 09:53
Saya mengkloning seluruh repositori scikit-learn dan menjalankan cython _splitter.pyx tanpa masalah (cython 0.24.1, versi apa pun >= 0.23 seharusnya baik-baik saja)
 – 
J.J. Hakala
26 Juli 2016, 10:28
Kamu benar. Ketika saya mengkloning repositori, itu berhasil. Saya menggunakan salinan folder sklearn saya untuk melakukannya, dan itu tidak berfungsi dengan baik. Terima kasih
 – 
LuizF Gonçalves
1 Agustus 2016, 22:39

1 menjawab

Jawaban Terbaik

Coba perbarui instalasi Cython Anda. Versi lama (<0,18) tidak mendukung kata kunci const.

Lihat bagaimana cara menggunakan const

Jawaban: Sejak Cython 0.18, Anda bisa menggunakannya dalam kode dan deklarasi Anda.

Versi Cython sebelumnya tidak mendukung const secara langsung dan memerlukan peretasan berikut untuk mengompilasinya ke dalam kode sumber C:

1
J.J. Hakala 26 Juli 2016, 07:37
Saya memutakhirkannya ke 0,24, tetapi saya mendapatkan banyak kesalahan baru sekarang, yang pada dasarnya sama: "Mengonversi ke objek Python tidak diizinkan tanpa gil" Ini terjadi di beberapa baris
 – 
LuizF Gonçalves
26 Juli 2016, 10:14
Pengecualian memberi tahu Anda apa masalahnya: Anda mencoba membuat objek Python dalam fungsi yang telah Anda definisikan sebagai nogil.
 – 
Snorfalorpagus
26 Juli 2016, 16:25