在 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即可运行(可能还是会有警告,但是无伤大雅...