VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 14
声望: 5

我才是不是标题党 我才不是标题党 我是标题党 阿呸...

想必大家肯定很好奇编译教程对吧 。 主要针对的是linux 环境ubuntu 19.04 (18.04) 也是可以的。
因为windows可以直接用哈 具体看setup.py的代码
废话不多说哦 ..... 以ctp为例
然后 然后 emmmmm
假定我们新建一个文件夹 , 文件结构如下
ctpapi
---->ctpapi
---------> ctp
---------> init.py
----> setup.py
---->MAINFEST.in
1 , 我们复制一份 vnpy/api下面的ctp目录 覆盖 ctpapi 的ctp目录哦
此时变化为
ctpapi
---->ctpapi
---------> ctp(覆盖后的)
---------> init.py
----> setup.py
---->MAINFEST.in

上面的init前后要加两个下划线 ,吐槽编辑器 过滤掉了。。

MAINFEST.in 的内容

# include MANIFEST.in
include README.md
recursive-include ctpapi/ctp *

然后我们在setup.py中写入以下内容

import platform
from setuptools import Extension, setup

dir_path = "ctpapi"

if platform.uname().system == "Windows":
    compiler_flags = [
        "/MP", "/std:c++17",  # standard
        "/O2", "/Ob2", "/Oi", "/Ot", "/Oy", "/GL",  # Optimization
        "/wd4819"  # 936 code page
    ]
    extra_link_args = []
else:
    compiler_flags = [
        "-std=c++17",  # standard
        "-O3",  # Optimization
        "-Wno-delete-incomplete", "-Wno-sign-compare", "-pthread"
    ]
    extra_link_args = ["-lstdc++"]

vnctpmd = Extension(
    # 指定 vnctpmd 的位置
    "ctpapi.ctp.vnctpmd",
    [
        f"{dir_path}/ctp/vnctp/vnctpmd/vnctpmd.cpp",
    ],
    # 编译需要的头文件
    include_dirs=[
        f"{dir_path}/ctp/include",
        f"{dir_path}/ctp/vnctp",
    ],
    # 指定为c plus plus
    language="cpp",
    define_macros=[],
    undef_macros=[],
    # 依赖目录
    library_dirs=[f"{dir_path}/ctp/libs", f"{dir_path}/ctp"],
    # 依赖项
    libraries=["thostmduserapi_se", "thosttraderapi_se", ],
    extra_compile_args=compiler_flags,
    extra_link_args=extra_link_args,
    depends=[],
    runtime_library_dirs=["$ORIGIN"],
)
vnctptd = Extension(
    "ctpapi.ctp.vnctptd",
    [
        f"{dir_path}/ctp/vnctp/vnctptd/vnctptd.cpp",
    ],
    include_dirs=[
        f"{dir_path}/ctp/include",
        f"{dir_path}/ctp/vnctp",
    ],
    define_macros=[],
    undef_macros=[],
    library_dirs=[f"{dir_path}/ctp/libs", f"{dir_path}/ctp"],
    libraries=["thostmduserapi_se", "thosttraderapi_se"],
    extra_compile_args=compiler_flags,
    extra_link_args=extra_link_args,
    runtime_library_dirs=["$ORIGIN"],
    depends=[],
    language="cpp",
)

if platform.system() == "Windows":
    # use pre-built pyd for windows ( support python 3.7 only ) 

    ext_modules = []
    # if you really want to build it . please check your environment (没测试过)
    # ext_modules = [vnctptd, vnctpmd]
elif platform.system() == "Darwin":
    ext_modules = []
else:
    ext_modules = [vnctptd, vnctpmd]

pkgs = ['ctpapi', 'ctpapi.ctp']
install_requires = []
setup(
    name='ctpapi',
    version='1.0',
    description="good luck",
    author='somewheve',
    author_email='####',
    license="MIT",
    packages=pkgs,
    install_requires=install_requires,
    platforms=["Windows", "Linux", "Mac OS-X"],
    package_dir={'ctpapi': 'ctpapi/'},
    package_data={'ctpapi': ['ctp/*', ]},
    ext_modules=ext_modules,
    classifiers=[
        'Development Status :: 4 - Beta',
        'Intended Audience :: Developers',
        'License :: OSI Approved :: MIT License',
        'Programming Language :: Python :: 3.7',
    ]
)

切换你的目录到setup.py的同级 ,打开命令行 。然后输入

python3.7 setup.py build

好像你就可以在ctpapi/build/lib.linux-x86_64-3.7/ctpapi/ctp 下面找到vnctpmd.cpython-37m-x86_64-linux-gnu.so 和 vnctptd.cpython-37m-x86_64-linux-gnu.so

把里面的ctpapi 复制出来放到一个新的地方
然后
在ctpapi的同级目录下打开Python3.7命令行输入

from ctpapi.ctp import vnctpmd
from ctpapi.ctp import vnctptd

具体代码我放到github上面 传说中的传送门
下载来 进入目录输入命令 python3.7 setup.py build 即可开始编译
当然你要注意自己环境 比如Gcc那些什么的。

ps: 如果我告诉你 上面的执行会出错你会不会打我?(即使编译不出错用起来也会出错的) 好吧 还需要安装语言支持

sudo locale-gen zh_CN.GB18030

请注意你的Python版本为3.7
ok 大功告成 !

最后插一句如果有帮到你点个star哈

Member
avatar
加入于:
帖子: 13
声望: 1
   写的非常好,电站!

然后呢,把 1.9.2LTS 及以下版本, 自己重构的代码 与 上述的ctp import vnctpmd 就是一个崭新的vnpy版本。。。

ubuntu 16.04 也可以的 。。。
Member
avatar
加入于:
帖子: 14
声望: 5

你有测试过吗......emmmmmmmmmmmmmmmmm

Member
avatar
加入于:
帖子: 13
声望: 1

心安勿念 wrote:

你有测试过吗......emmmmmmmmmmmmmmmmm
嗯嗯,有道理,必须测试过。。。

Member
avatar
加入于:
帖子: 4
声望: 0

Mac
上 如何编译啊。。
有没有好的方法

Member
加入于:
帖子: 33
声望: 1

啃哒你伐木工 wrote:

心安勿念 wrote:

你有测试过吗......emmmmmmmmmmmmmmmmm
嗯嗯,有道理,必须测试过。。。

linux重新编译so文件没啥问题 但是想知道 windows下pyd如何重新生成,sln工程如何编译

Member
avatar
加入于:
帖子: 31
声望: 1

陳大锤 wrote:

啃哒你伐木工 wrote:

心安勿念 wrote:

你有测试过吗......emmmmmmmmmmmmmmmmm
嗯嗯,有道理,必须测试过。。。

linux重新编译so文件没啥问题 但是想知道 windows下pyd如何重新生成,sln工程如何编译
以2.0.7为例,大概需要安装vs2017,还有python3.7 64位版本。在vnctp目录下有个vnctp.sln。可能还需要修改一点库目录的路径什么的。
不太复杂,按照编译sln的错误提示即可。windows下的生成pyd工程,是可用的。

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】