如何把python核心包变为so文件

是的,你可以将整个 Python 文件夹(模块)编译为 .so 文件(共享库),然后其他 Python 文件可以通过 import 正常使用。以下是实现这一目标的详细步骤:


步骤 1:安装依赖

你需要使用 cythonsetuptools 来将 Python 源代码编译为 .so 文件。请确保安装了以下依赖:

pip install cython setuptools

步骤 2:准备你的代码

假设你的文件夹结构如下:

project/
├── core/
│   ├── __init__.py
│   ├── base_condition.py
│   ├── candidate_prodx.py
│   ├── conditions.py
│   ├── config.py
│   ├── monitor2.py
│   ├── monitorx.py
│   ├── monitorx_bak.py
│   ├── strategy_base.py
│   ├── strategy_factory.py
│   ├── task.py
│   ├── task_prodx.py
│   └── trading_task.py
├── setup.py
└── main.py

其中:

  • core/ 是你想要编译的模块。
  • setup.py 是用来配置和编译的脚本。
  • main.py 是调用 core 模块的脚本。

步骤 3:创建 setup.py 文件

project/ 文件夹中创建一个 setup.py 文件,内容如下:

from setuptools import setup, Extension
from Cython.Build import cythonize
import os

# 获取 core 文件夹下的所有 .py 文件(除了 __init__.py)
def find_py_files(folder):
    py_files = []
    for root, _, files in os.walk(folder):
        for file in files:
            if file.endswith(".py") and file != "__init__.py":
                py_files.append(os.path.join(root, file))
    return py_files

# 将 Python 文件编译为扩展模块
extensions = [
    Extension(
        file.replace("/", ".").replace("\\", ".").replace(".py", ""),
        [file]
    )
    for file in find_py_files("core")
]

setup(
    name="core",
    ext_modules=cythonize(extensions, language_level="3"),
    packages=["core"],
)

说明:

  1. find_py_files 函数会递归查找 core/ 文件夹下的所有 .py 文件(除了 __init__.py)。
  2. cythonize 将这些 Python 文件编译为 C 扩展模块(.so 文件)。
  3. packages=["core"] 指定 core 是一个 Python 包。

步骤 4:编译代码

project/ 文件夹下运行以下命令:

python setup.py build_ext --inplace

运行后,core/ 文件夹中的所有 .py 文件(除了 __init__.py)都会被编译为 .so 文件,生成的文件名类似于:

core/
├── __init__.py
├── base_condition.cpython-<version>-<platform>.so
├── candidate_prodx.cpython-<version>-<platform>.so
├── conditions.cpython-<version>-<platform>.so
├── config.cpython-<version>-<platform>.so
├── monitor2.cpython-<version>-<platform>.so
├── monitorx.cpython-<version>-<platform>.so
├── monitorx_bak.cpython-<version>-<platform>.so
├── strategy_base.cpython-<version>-<platform>.so
├── strategy_factory.cpython-<version>-<platform>.so
├── task.cpython-<version>-<platform>.so
├── task_prodx.cpython-<version>-<platform>.so
└── trading_task.cpython-<version>-<platform>.so

.so 文件是编译后的共享库文件。


步骤 5:使用编译后的模块

编译完成后,你可以像平常一样在其他 Python 文件中导入 core 模块。例如:

# main.py
from core.conditions import SomeConditionClass
from core.monitorx import MonitorX

# 使用 core 模块中的类和函数
condition = SomeConditionClass()
monitor = MonitorX()

注意事项

  1. __init__.py 文件

    • __init__.py 文件不会被编译为 .so,它仍然是纯 Python 文件。
    • 如果你需要编译它,可以单独添加到 extensions 列表中。
  2. Cython 的限制

    • 如果你的代码中使用了某些动态特性(如 execeval),可能无法正常编译。
    • 如果某些代码无法编译,你可以在文件顶部添加 # cython: language_level=3 或将其保留为纯 Python 文件。
  3. 性能优化

    • 编译后的 .so 文件会提高代码的运行速度,但提升幅度取决于代码的复杂性和执行方式。
    • 计算密集型代码会有显著的性能提升,而 I/O 密集型代码提升有限。
  4. 跨平台兼容性

    • 编译生成的 .so 文件与 Python 版本和操作系统绑定。例如,cpython-<version>-<platform> 表示它只能在特定的 Python 版本和平台上运行。
    • 如果需要分发代码,建议提供源代码或不同平台的编译版本。

扩展:将整个模块打包为 .whl 文件

如果你需要分发编译后的模块,可以将其打包为 .whl 文件:

  1. setup.py 中添加以下内容:

    from setuptools import find_packages
    setup(
        name="core",
        version="1.0",
        ext_modules=cythonize(extensions, language_level="3"),
        packages=find_packages(),
    )
    
  2. 运行以下命令生成 .whl 文件:

    python setup.py bdist_wheel
    
  3. 生成的 .whl 文件会存放在 dist/ 文件夹下,可以通过 pip install 安装。


通过上述方法,你可以将整个 core 文件夹编译为 .so 文件,并在其他 Python 文件中正常使用。如果有其他问题,欢迎随时提问!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,151评论 6 523
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,465评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,429评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,147评论 1 301
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,149评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,614评论 1 315
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,965评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,950评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,486评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,524评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,640评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,228评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,976评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,407评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,552评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,215评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,714评论 2 366

推荐阅读更多精彩内容