私はPythonのnoobです。the KmeansRex library from githubで例を実行しようとしています。私はubuntuマシンを使用しています。これはsetup.py
のファイルを持たないライブラリです。いくつかの試みがあったにもかかわらず、プロジェクトのgithubページのREADMEファイルに示されている短いコード例を実行することができませんでした。github :: KMeansRex Pythonライブラリのインストール/ロード
このライブラリをインストールしようとするには、私が行います
git clone https://github.com/michaelchughes/KMeansRex.git
は、それから私は、私は、64ビットマシン上で午前としてだけではなく、libkmeansrex.so
の.so
ファイルlibkmeansrex64.so
を命名、githubのページの指示に従って(やります):
g++ --shared -o libkmeansrex64.so KMeansRexCore.cpp -I/home/path/to/eigen/ -O3 -DNDEBUG
/usr/bin/ld: /tmp/ccdmUbg9.o: relocation R_X86_64_32S against `.bss' can not be used when making a shared object; recompile with -fPIC
/tmp/ccdmUbg9.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
は私が行います
g++ --shared -o libkmeansrex64.so KMeansRexCore.cpp -I/home/path/to/eigen/ -O3 -fpic -DNDEBUG
(これはエラーなしでコンパイルされます)。それから私はない:
cd KMeansRex/
それから私は実行します(これまでのところは良い)
Python 2.7.11+ (default, Apr 17 2016, 14:00:29)
[GCC 5.3.1 20160413] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np;
:
python
私は、例えばgithubの上の指示に従ってください。しかし、その後、私が行います
import KMeansRex
のみを取得する:コンパイラは
libkmeansrex64.so
を生産なかったため、奇数である
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "KMeansRex/__init__.py", line 1, in <module>
from KMeansRex import RunKMeans
File "KMeansRex/KMeansRex.py", line 30, in <module>
lib = ctypes.cdll.LoadLibrary(os.path.join(parentdir,'libkmeansrex64.so'))
File "/usr/lib/python2.7/ctypes/__init__.py", line 443, in LoadLibrary
return self._dlltype(name)
File "/usr/lib/python2.7/ctypes/__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
OSError: libkmeansrex64.so: cannot open shared object file: No such file or directory
:
/KMeansRex$ ls -n
total 84
drwxrwxr-x 2 1000 1000 4096 Mai 22 13:24 demonumpyctypes
drwxrwxr-x 3 1000 1000 4096 Mai 22 14:00 KMeansRex
-rw-rw-r-- 1 1000 1000 7003 Mai 22 13:24 KMeansRexCore.cpp
-rw-rw-r-- 1 1000 1000 635 Mai 22 13:24 KMeansRexCore.h
-rw-rw-r-- 1 1000 1000 2214 Mai 22 13:24 KMeansRex.cpp
-rwxrwxr-x 1 1000 1000 41792 Mai 22 13:24 libkmeansrex64.so
-rw-rw-r-- 1 1000 1000 1541 Mai 22 13:24 LICENSE
-rw-rw-r-- 1 1000 1000 7899 Mai 22 13:24 mersenneTwister2002.c
-rw-rw-r-- 1 1000 1000 1396 Mai 22 13:24 README
編集:解決
問題(ユーザーkvorobiev
のおかげで)。
lib = ctypes.cdll.LoadLibrary(os.path.join(parentdir,'libkmeansrex64.so'))
を交換する必要があることは明らかである
libkmeansrex64.so
:だからライン
lib = ctypes.cdll.LoadLibrary(os.path.join(parentdir,'libkmeansrex64.so'))
前に、私は
print os.path.join(parentdir,'libkmeansrex64.so')
とプロンプトプリントを追加しましたこれを行う
lib = ctypes.cdll.LoadLibrary(os.path.join(parentdir,'/path/to/libkmeansrex64.so'))
、それはすべて正常に動作します。)
@renemilk絶対パスをハードコード:soory私は理解していないが。あなたは 'dlopen'呼び出しを変更する方法をより良く説明できますか? – user189035
'KMeansRex.py'ファイルを開き、' lib = ctypes.cdll.LoadLibraryの直前に 'os.path.join(parentdir、 'libkmeansrex64.so')'行を挿入するだけです(os.path.join(parentdir、 'libkmeansrex64 .so ')) 'あなたの質問に結果を追加してください。 – kvorobiev
@kvorobiev:問題を修正しました!この質問を削除する必要がありますか? – user189035