### 文章目录
- [@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
- 文件后缀名称推荐使用pyx,py也可以;
- 需要创建setup.py编译文件;
- 编译为pyd后调用logging无法输出行号、文件名、函数名;
-
安装
pip install setuptools Cython -
创建一个
hello.pyx文件,如果在pycharm中不能高亮显示则打开【文件】【设置】【编辑器】【文件类型】【python】,添加一个*.pyx;
pydef 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;pythonfrom setuptools import setup from Cython.Build import cythonize setup( ext_modules = cythonize("hello.pyx"), zip_safe=False, ) -
运行
python setup.py build_ext --inplace来编译生成扩展模块。 -
静态导入模块
pythonfrom plugins.hello import * fun1() h = Hello() h.fun() -
动态导入模块(可实现插件)
pythonimport 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代码
- 打包为pyd后调用logging可以输出文件名、行号等信息,保持了Python的调用栈信息;
- 打包速度较慢、生成文件体积大;
- 安装
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()