2016-05-22 10 views
1

私は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')) 

、それはすべて正常に動作します。)

+0

@renemilk絶対パスをハードコード:soory私は理解していないが。あなたは 'dlopen'呼び出しを変更する方法をより良く説明できますか? – user189035

+1

'KMeansRex.py'ファイルを開き、' lib = ctypes.cdll.LoadLibraryの直前に 'os.path.join(parentdir、 'libkmeansrex64.so')'行を挿入するだけです(os.path.join(parentdir、 'libkmeansrex64 .so ')) 'あなたの質問に結果を追加してください。 – kvorobiev

+0

@kvorobiev:問題を修正しました!この質問を削除する必要がありますか? – user189035

答えて

1

KMeansRex.pyのパスに問題があります。 python3で

import os 
... 

curdir = os.path.split(__file__)[0] 
parentdir = os.path.split(curdir)[0] 
... 

__file__は、ファイルへの絶対パスが含まれているため、このコードは、正常に動作します。しかしyou aren't inside the part of sys.path that contains the module, you'll get an absolute path. If you are inside the part of sys.path that contains the module, you'll get a relative path.
場合Python2にあなたは

import os 
... 

curdir = os.path.split(os.path.abspath(__file__))[0] 
parentdir = os.path.split(curdir)[0] 
... 

を使用することができますまたはちょうどあなたのライブラリに

lib = ctypes.cdll.LoadLibrary('/abs/path/to/lib/libkmeansrex64.so') 
関連する問題