1. 准备 Python 与受保护功能
为商业 Python 命令行工具或桌面应用接入客户授权码,在运行受保护功能前检查权限。这些检查控制的是你的应用使用权限,不会改变 Python 解释器自身的开源许可证。应用负责接收激活输入并提供业务回调。
设备额度按当前激活设备计算,释放后返还;普通授权离线仍占用,浮动授权租约到期后自动返还。
- 在控制台“产品”复制产品 ID,点击同一产品的“签名公钥”,将每一组密钥 ID、公钥填进初始化代码,替换 YOUR_PRODUCT_ID、YOUR_KEY_ID 和 YOUR_PUBLIC_KEY。快速接入也可以直接复制已填好的代码。无需配置文件;SDK 默认连接 https://www.licentivo.com。
- 安装 Python 3.10 或更高版本,创建项目目录。
- 在 Licentivo 快速接入中创建或选择产品,让策略和许可证允许不计次数的 export 功能。
2. 在虚拟环境安装 SDK
在自己的应用项目中运行下方安装命令或加入构建依赖,安装 SDK 0.11.6。包管理器负责获取 SDK,无需下载解压源码包或设置本地源码路径。
python -m venv .venv
./.venv/Scripts/python.exe -m pip install "licentivo-sdk==0.11.6"python3 -m venv .venv
./.venv/bin/python -m pip install "licentivo-sdk==0.11.6"3. 导出之前验证许可证
将 SDK 初始化接到自己软件的启动或激活入口,从激活窗口读取客户授权码,传入自己的产品 ID、受信公钥并保持客户端存活。把 run_feature 放在真实业务入口,将导出示例函数替换成自己的实际功能。
"""A protected operation to move into your own application's business handler."""
import os
import sys
from pathlib import Path
from licentivo import Client
# BEGIN LICENTIVO PRODUCT
# Copy Product ID and all key ID/public key pairs from Console > Products > Signing public keys.
PRODUCT_ID = 'YOUR_PRODUCT_ID'
TRUSTED_KEYS = {'YOUR_KEY_ID': 'YOUR_PUBLIC_KEY'}
# END LICENTIVO PRODUCT
def export_report(path):
# Replace this write with your existing, non-metered export operation.
Path(path).write_text('A report generated by the licensed application.\n', encoding='utf-8')
def main():
# In a GUI, read the activation input; later starts pass an empty key.
with Client.open_product(
PRODUCT_ID, TRUSTED_KEYS,
os.getenv('LICENTIVO_LICENSE_KEY', ''),
on_error=lambda error: print(f'Background verification: {error}', file=sys.stderr),
) as client:
feature = os.getenv('LICENTIVO_FEATURE', 'export')
path = os.getenv('LICENTIVO_OUTPUT', 'licensed-report.txt')
action = lambda: export_report(path)
if os.getenv('LICENTIVO_METERED') == '1':
client.run_metered_feature(feature, 1, os.getenv('LICENTIVO_OPERATION_ID', ''), action)
else:
client.run_feature(feature, action)
print(f'License OK: {feature} is available\nExport completed: {path}')
# Keep this context open until your real app exits. No Deactivate on normal exit.
if __name__ == '__main__':
try:
main()
except Exception as error:
print(str(error), file=sys.stderr)
sys.exit(2)
$env:LICENTIVO_LICENSE_KEY = 'YOUR_TEST_LICENSE_KEY'
./.venv/Scripts/python.exe app.py
# On later starts, restore the saved device credential:
Remove-Item Env:LICENTIVO_LICENSE_KEY
./.venv/Scripts/python.exe app.pyexport LICENTIVO_LICENSE_KEY='YOUR_TEST_LICENSE_KEY'
./.venv/bin/python app.py
# On later starts, restore the saved device credential:
unset LICENTIVO_LICENSE_KEY
./.venv/bin/python app.py4. 在桌面应用中保留客户端
命令行导出可以用 with 包住整个操作。桌面应用在激活时建立客户端,保留到窗口关闭,不要每次点击按钮都重新建立和关闭。
将联网激活和其他网络操作放在 GUI 线程之外执行,再切回界面线程更新结果。Tkinter 桌面示例通过下方文档链接单独提供;pip 安装包不包含该示例的源码。
每个导出按钮、快捷键和命令都调用 client.run_feature("export", lambda: export_report(path))。退出时调用 close,保留设备绑定登记,并尝试归还浮动席位。
再次启动时,在相同产品、操作系统用户及缓存路径下传入空授权码,恢复设备凭证。离线启动仍取决于有效签名和授权策略;浮动授权和必须联网的启动需要服务器确认。
5. 验证允许与拒绝的操作
- 用测试授权码激活,检查实际生成的导出文件。
- 移除 LICENTIVO_LICENSE_KEY,用相同虚拟环境和操作系统用户重启,确认设备凭证被恢复。
- 将 LICENTIVO_FEATURE 设为许可证中不存在的功能,LICENTIVO_OUTPUT 设为新文件名。应返回非零退出码,且不生成新导出文件。
- 启用计次前先配置次数规则,设置 LICENTIVO_METERED=1,并为持久业务任务提供 LICENTIVO_OPERATION_ID。确认成功业务只扣一次。
排查安装与授权问题
检查产品 ID、每组密钥 ID 和公钥、客户输入的授权码。公钥属于产品;客户许可证和本机凭证分别管理。开发测试授权码和厂商管理 API Key 不进入客户安装包。
ModuleNotFoundError 通常是 pip 与应用使用了不同的 Python。安装和执行都用同一虚拟环境中的解释器。
许可证到期或功能被拒绝时必须停止业务,显示 SDK 错误及可用的请求编号,不要在检查失败后直接调用导出函数。
计次操作需要联网。保留稳定任务编号和持久结果,以便恢复待确认任务而不重复执行业务。不要分发签名缓存、设备凭证、测试授权码或厂商管理 Key。