如何调整__init__.py中外部自定义库libcustom.so的导入路径?
调整Python子包中共享库的导入路径
背景
原目录结构:
- Geometry - CPP (存放所有C++代码) - Cython - src folder - Geometry Package - Point Package - __init__.py - libcustom.so - Circle Package - __init__.py - libcustom.so - __init__.py (忽略此文件) - libcustom.so - test folder - setup.py
之前Point和Circle包的__init__.py里用这段代码导入本地共享库:
import ctypes import os libcustom = ctypes.CDLL(os.path.join(os.path.dirname(__file__), "libcustom.so"))
现在想删掉重复的libcustom.so,只保留Geometry Package根目录下的那一份,调整后的目录结构:
- Geometry - CPP (存放所有C++代码) - Cython - src folder - Geometry Package - Point Package - __init__.py - Circle Package - __init__.py - libcustom.so - __init__.py (忽略此文件) - test folder - setup.py
修改方式
方式一:直接通过路径向上定位
把Point和Circle里的__init__.py改成下面这样——多调用一次os.path.dirname,跳回到上层的Geometry Package目录找库:
import ctypes import os # 从子包目录往上跳一级,定位到Geometry Package下的libcustom.so lib_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "libcustom.so") libcustom = ctypes.CDLL(lib_path)
方式二:利用包的导入路径(更稳妥)
如果Geometry Package已经被正确加入Python的搜索路径,也可以通过包的模块信息定位,避免后续路径层级变动时出错:
import ctypes import os import sys # 获取Geometry Package的安装路径 geometry_root = os.path.dirname(sys.modules['Geometry Package'].__file__) lib_path = os.path.join(geometry_root, "libcustom.so") libcustom = ctypes.CDLL(lib_path)
注意:这里的'Geometry Package'要换成你实际的包名,比如如果包名是geometry_package(下划线代替空格),就对应修改字符串内容
内容的提问来源于stack exchange,提问作者Punreach Rany
相关产品推荐
相关产品推荐

