Python包外部导入触发OSError:libcilin_similarity.dylib找不到求助
解决Python包导入时无法找到动态库及文件的问题
这是个很典型的路径问题,核心原因是直接运行__init__.py和从外部导入时,Python的当前工作目录完全不同:
- 直接运行
__init__.py时,你的工作目录就是cilin_similarity包所在的文件夹,所以相对路径libcilin_similarity.dylib和cilin.txt都能被正常找到。 - 但从外部的
try.py导入包时,工作目录是try.py所在的文件夹,这时候用相对路径就会去try.py的目录找文件,自然找不到目标资源。
而你尝试用绝对路径时出现文件打开错误,大概率是只修改了动态库的路径,但read_cilin调用里的cilin.txt还是用了相对路径——动态库内部打开文件时依然会基于当前工作目录去查找,所以同样会失败。
解决方案:用包的绝对路径定位所有资源文件
修改你的__init__.py代码,通过__file__变量获取包的绝对路径,再安全拼接所有资源文件的路径:
# mypackage/__init__.py import ctypes import os # 获取包的绝对目录路径(不管从哪里导入,这个路径都是固定的) package_dir = os.path.dirname(os.path.abspath(__file__)) def init_lib(): print("init_lib") # 拼接动态库的绝对路径 lib_path = os.path.join(package_dir, "libcilin_similarity.dylib") lib = ctypes.CDLL(lib_path) # 拼接cilin.txt的绝对路径,再传入动态库 cilin_path = os.path.join(package_dir, "cilin.txt").encode('UTF-8') lib.read_cilin(cilin_path) lib.similarity.restype = ctypes.c_float return lib def compare(lib, first_word, second_word): print("this should work") print(second_word, lib.similarity(first_word.encode('UTF-8'), second_word.encode('UTF-8')))
关键逻辑说明:
os.path.abspath(__file__):获取当前__init__.py文件的绝对路径,不受工作目录影响。os.path.dirname(...):从文件路径中提取出包所在的目录(也就是cilin_similarity文件夹的绝对路径)。os.path.join(...):跨平台安全拼接目录和文件名,避免手动拼接路径时出现的斜杠、路径分隔符问题。
这样不管你从哪个位置导入这个包,代码都会从包的实际安装目录去查找动态库和cilin.txt,彻底解决路径不一致的问题。
内容的提问来源于stack exchange,提问作者bolerovt
相关产品推荐
相关产品推荐

