mac osx libsvm与python接口:ModuleNotFoundError: No module named 'svm'

来源:互联网 发布:淘宝可以apple pay吗 编辑:程序博客网 时间:2024/05/29 02:37

系统为oxs,python平台为anaconda简单粗暴打包下载版,想要使用libsvm,采用方案为以下网址:

http://blog.csdn.net/daizziad1314/article/details/52528395

对这个方案我想先做出以下两点修正:

1. mac os 应该是在libsvm的路径下执行 >> make lib;虽然说个人现在也不是很懂这一步的意义是什么,也不是很懂.so.2的用途是什么。如果有网友知道这块的知识,欢迎在下方留言~

2. __init__.py而非init.py,有常识的都懂,不赘述。


然后呵呵了...

>>from libsvm import svmutil

ModuleNotFoundError: No module named 'svm'

还有一个错误,大概是说没有LIBSVM这个包。


后面又采用了一个方案:

http://www.cnblogs.com/zhizhan/p/5956303.html

但是略有心理洁癖,不想每次写都自行加路径,辣眼睛。



对于没有LIBSVM这个包,这个问题产生的原因是因为我在最开始的时候就把svm.py和svmutil.py这两个文件和运行的.py文件单独放在了一个路径p1下,因此python在运行的时候就找到的是这两个文件,而非通过http://blog.csdn.net/daizziad1314/article/details/52528395在site-packages里面放置的svm.py和svmutil.py。而svm.py在运行的时候会主动去找libsvm.so.2,但因为这个文件放在了site-packages的相应位置而没有放在p1的外面,程序就认为这个svm并非是一个module,所以就报错了。(代码长下面这个样子...)

try:
dirname = path.dirname(path.abspath(__file__))
if sys.platform == 'win32':
libsvm = CDLL(path.join(dirname, r'..\windows\libsvm.dll'))
else:
libsvm = CDLL(path.join(dirname, '../libsvm.so.2'))
except:
# For unix the prefix 'lib' is not considered.
if find_library('svm'):
libsvm = CDLL(find_library('svm'))
elif find_library('libsvm'):
libsvm = CDLL(find_library('libsvm'))
else:
raise Exception('LIBSVM library not found.')



对于ModuleNotFoundError: No module named 'svm',确实是缺失了路径。但发生的原因个人理解应该是在于svmutil.py内部。这个文件里面有这么两行代码:

from svm import *
from svm import __all__ as svm_all

很明显,这个时候../python3.6/site-packages/libsvm并不在系统路径下,所以编译器并不知道要到哪里去找这个svm。所以这个时候如果把这两行改为:

from libsvm.svm import *
from libsvm.svm import __all__ as svm_all

我们通过sys可以看到../python3.6/site-packages/是在系统路径下的,所以编译器可以沿着这条路,找到libsvm,再找到svm,进而可以完成这个包的编译。



------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在下计算机菜鸡,如上述有任何错误,请在留言区指出。万分感谢~





0 0
原创粉丝点击