(25)python开发经验

### 文章目录

  • [@toc](#文章目录 @[toc] 1 python代码将dll添加进临时环境变量 2 python模块/插件开发 3 python打包后动态调用python代码)
  • [1 python代码将dll添加进临时环境变量](#文章目录 @[toc] 1 python代码将dll添加进临时环境变量 2 python模块/插件开发 3 python打包后动态调用python代码)
  • [2 python模块/插件开发](#文章目录 @[toc] 1 python代码将dll添加进临时环境变量 2 python模块/插件开发 3 python打包后动态调用python代码)
  • [3 python打包后动态调用python代码](#文章目录 @[toc] 1 python代码将dll添加进临时环境变量 2 python模块/插件开发 3 python打包后动态调用python代码)
更多精彩内容
👉内容导航 👈
👉Qt开发 👈
👉python开发 👈

1 python代码将dll添加进临时环境变量

python 复制代码
import os
def add_dll_directory(dll_path):
    """
    将DLL目录添加到环境变量中
    """
    if os.path.exists(dll_path):
        # 添加到PATH环境变量开头
        print(os.pathsep)
        os.environ['PATH'] = dll_path + os.pathsep + os.environ.get('PATH', '')
        print(f"已添加 {dll_path} 到环境变量")
    else:
        print(f"路径 {dll_path} 不存在")
add_dll_directory("./")

2 python模块/插件开发

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

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

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

    py 复制代码
    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;

    python 复制代码
    from setuptools import setup
    from Cython.Build import cythonize
    
    setup(
        ext_modules = cythonize("hello.pyx"),
        zip_safe=False,
    )
  • 运行 python setup.py build_ext --inplace 来编译生成扩展模块。

  • 静态导入模块

    python 复制代码
    from plugins.hello import *
    
    fun1()
    h = Hello()
    h.fun()
  • 动态导入模块(可实现插件)

    python 复制代码
    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()

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

  1. 打包为pyd后调用logging可以输出文件名、行号等信息,保持了Python的调用栈信息;
  2. 打包速度较慢、生成文件体积大;
  • 安装pip install nuitka
  • 使用命令nuitka --module your_module.py编译为pyd;(编译单文件)
  • 使用命令nuitka --module --include-package=src src将src模块编译为pyd(一个包)
    • 确保模块有__init__.py文件,这样 Python 会把它当作包处理;
    • --module 表示生成 .pyd 文件;
    • --include-package=src 指定要包含的包(假设你的包名为 src);
    • src 是要打包的包目录;

3 python打包后动态调用python代码

  • 将python代码打包成可执行程序后如何调用.py代码
python 复制代码
import importlib.util
import importlib
import sys
from pathlib import Path
from log.log import logger, initLog

initLog()

# 从文件路径导入
file_path = Path("./plugins/hello.py")
spec = importlib.util.spec_from_file_location(file_path.stem, file_path)
module = importlib.util.module_from_spec(spec)
sys.modules[file_path.stem] = module
spec.loader.exec_module(module)

# --------调用模块
print(module)
setlog = getattr(module, "setlog")
setlog(logger)
fun1 = getattr(module, "fun1")
fun1()
相关推荐
知识分享小能手14 小时前
Flask入门学习教程,从入门到精通,Flask智能租房——详情页完整知识点详解(8)
python·学习·flask
Irissgwe14 小时前
十、LangGraph能力详解(1)LangGraph介绍及核心概念
python·ai·langchain·ai编程·工作流·langgraph
l1t14 小时前
DeepSeek总结的使用实体-组件-系统和基于存在性处理进行Python编程9-11
开发语言·python
keineahnung234514 小时前
在 Google Colab 中安裝 PyTorch 2.2.0
人工智能·pytorch·python·深度学习
逆光行14 小时前
奖池派对自动化测试方案与实践报告
python·功能测试·postman
z落落14 小时前
C# 局部方法 + Lambda表达式 + 三大委托和三大委托的区别和手写 Array.Find 底层源码原理(自定义MyArray.Find)
开发语言·c#
AC赳赳老秦14 小时前
OpenClaw多Agent分工协作:按工作模块拆分Agent,实现全流程自动化闭环
java·大数据·数据库·python·自动化·php·openclaw
十年伴树14 小时前
python --version返回空行
开发语言·python
meilindehuzi_a14 小时前
AI 时代的高效编程:从 Python 切片基础到魔塔社区大模型 Prompt 实战
python·prompt