python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python代码编译为pyd文件

将Python代码编译为pyd文件的两种方法

作者:mahuifa

文章介绍了两种将Python代码编译为pyd文件的方法:使用Cython和使用Nuitka,Cython方法可以正常调用logging,但不支持高亮显示,Nuitka方法可以保持调用栈信息,但打包速度慢且生成文件体积大,下面小编为大家详细说说,需要的朋友可以参考下

方法1:使用Cython编译python模块为pyd

  1. 文件后缀名称推荐使用pyx,py也可以;
  2. 需要创建setup.py编译文件;
  3. 编译为pyd后调用logging无法输出行号、文件名、函数名;

安装pip install setuptools Cython

创建一个hello.pyx文件,如果在pycharm中不能高亮显示则打开【文件】【设置】【编辑器】【文件类型】【python】,添加一个*.pyx

def fun1():
    print("Hello from plugin function fun1!")

class Hello:
    def __init__(self):
        pass
    def fun(self):
        print("Hello from plugin class Hello!")

创建一个setup.py文件,用于将hello.pyx编译为pyd;

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("hello.pyx"),
    zip_safe=False,
)

运行 python setup.py build_ext --inplace 来编译生成扩展模块。

静态导入模块

from plugins.hello import *

fun1()
h = Hello()
h.fun()

动态导入模块(可实现插件)

import importlib

# 动态导入 plugins.hello 模块
module = importlib.import_module("plugins.hello")
# 或者
sys.path.insert(0, plugin_path) # 添加插件目录到系统路径,以便可以找得到插件
module = importlib.import_module("hello")

# 从模块中获取 fun1 函数并调用
fun1 = getattr(module, "fun1")
fun1()

# 从模块中获取 Hello 类并实例化,然后调用其 fun 方法
Hello = getattr(module, "Hello")
h = Hello()
h.fun()

方法2:使用nuitka打包现有py代码

  1. 打包为pyd后调用logging可以输出文件名、行号等信息,保持了Python的调用栈信息;
  2. 打包速度较慢、生成文件体积大;

以上就是将Python代码编译为pyd文件的两种方法的详细内容,更多关于Python代码编译为pyd文件的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文