在 MacOS 上使用 Anaconda 安装 vn.py 框架及其 CTP 接口模块 vnpy_ctp
时,虽然 pip 显示模块已安装成功,但在pycharm中导入模块时却出现如下报错:
Unresolved reference 'vnpy_ctp'
于是我在终端进行该包的导入:
python -c "import vnpy_ctp; print(vnpy_ctp.__file__)"
结果显示如下:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/vnpy_ctp/__init__.py", line 26, in <module>
from .gateway import CtpGateway
File "/Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/vnpy_ctp/gateway/__init__.py", line 1, in <module>
from .ctp_gateway import CtpGateway
File "/Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/vnpy_ctp/gateway/ctp_gateway.py", line 31, in <module>
from ..api import (
File "/Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/vnpy_ctp/api/__init__.py", line 1, in <module>
from .vnctpmd import MdApi # noqa
ImportError: dlopen(/Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/.vnpy_ctpapi/vnctpmd.cpython-310-darwin.so, 0x0002): Library not loaded: @rpath/thostmduserapi_se.framework/Versions/A/thostmduserapi_se
Referenced from: <C6CBAD51-EBFD-3B3C-B1D0-186E211BA25E> /Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/.vnpy_ctpapi/vnctpmd.cpython-310-darwin.so
Reason: tried: '/Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/.vnpy_ctpapi/thostmduserapi_se.framework/Versions/A/thostmduserapi_se' (no such file), '/Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/.vnpy_ctpapi/thostmduserapi_se.framework/Versions/A/thostmduserapi_se' (no such file), '/Users/zohix/opt/anaconda3/envs/vnpy/bin/../lib/thostmduserapi_se.framework/Versions/A/thostmduserapi_se' (no such file), '/Users/zohix/opt/anaconda3/envs/vnpy/bin/../lib/thostmduserapi_se.framework/Versions/A/thostmduserapi_se' (no such file)
可以看到我的.so文件确实内嵌了一个路径:
@rpath/thostmduserapi_se.framework/Versions/A/thostmduserapi_se
而我的文件又确实放在目录下
/Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/vnpy_ctp/api/thostmduserapi_se.framework
所以可能是 @rpath 未正确配置的问题
因此这里我进入vnpy_ctp目录的.vnpy_ctpapi目录下
cd /Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/.vnpy_ctpapi
将完整的 @rpath 分别添加到vnctpmd以及vnctptd的.so文件:
install_name_tool -add_rpath /Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/vnpy_ctp/api vnctpmd.cpython-310-darwin.so
install_name_tool -add_rpath /Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/vnpy_ctp/api vnctptd.cpython-310-darwin.so
(此时可能还要打开一下这两个动态链接库文件,但是在我的mac上是不用的)
此时再次运行
python -c "import vnpy_ctp; print(vnpy_ctp.__file__)"
则能够正确导出正确的路径
/Users/zohix/Zohix/Code/Pycharm/量化/vnpy-4.1.0/github/vnpy_ctp/vnpy_ctp/__init__.py
在pycharm中执行main即可运行(可能还是会有警告,但是无伤大雅...