跳到正文
LICENTIVO / INTEGRATION

Python 软件授权:授权码验证教程

为 Python 应用接入授权码验证。创建虚拟环境、激活授权、控制功能权限,并验证已保存凭证的恢复与拒绝访问。

Python 3.10+ · 命令行与桌面应用更新日期

1. 准备 Python 与受保护功能

为商业 Python 命令行工具或桌面应用接入客户授权码,在运行受保护功能前检查权限。这些检查控制的是你的应用使用权限,不会改变 Python 解释器自身的开源许可证。应用负责接收激活输入并提供业务回调。

设备额度按当前激活设备计算,释放后返还;普通授权离线仍占用,浮动授权租约到期后自动返还。

  1. 在控制台“产品”复制产品 ID,点击同一产品的“签名公钥”,将每一组密钥 ID、公钥填进初始化代码,替换 YOUR_PRODUCT_ID、YOUR_KEY_ID 和 YOUR_PUBLIC_KEY。快速接入也可以直接复制已填好的代码。无需配置文件;SDK 默认连接 https://www.licentivo.com。
  2. 安装 Python 3.10 或更高版本,创建项目目录。
  3. 在 Licentivo 快速接入中创建或选择产品,让策略和许可证允许不计次数的 export 功能。

2. 在虚拟环境安装 SDK

在自己的应用项目中运行下方安装命令或加入构建依赖,安装 SDK 0.11.6。包管理器负责获取 SDK,无需下载解压源码包或设置本地源码路径。

Windows · PowerShell
python -m venv .venv
./.venv/Scripts/python.exe -m pip install "licentivo-sdk==0.11.6"
Linux / macOS · Bash
python3 -m venv .venv
./.venv/bin/python -m pip install "licentivo-sdk==0.11.6"

3. 导出之前验证许可证

将 SDK 初始化接到自己软件的启动或激活入口,从激活窗口读取客户授权码,传入自己的产品 ID、受信公钥并保持客户端存活。把 run_feature 放在真实业务入口,将导出示例函数替换成自己的实际功能。

Python · 完整 app.py
"""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)
Windows · PowerShell
$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.py
Linux / macOS · Bash
export 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.py

4. 在桌面应用中保留客户端

命令行导出可以用 with 包住整个操作。桌面应用在激活时建立客户端,保留到窗口关闭,不要每次点击按钮都重新建立和关闭。

将联网激活和其他网络操作放在 GUI 线程之外执行,再切回界面线程更新结果。Tkinter 桌面示例通过下方文档链接单独提供;pip 安装包不包含该示例的源码。

每个导出按钮、快捷键和命令都调用 client.run_feature("export", lambda: export_report(path))。退出时调用 close,保留设备绑定登记,并尝试归还浮动席位。

再次启动时,在相同产品、操作系统用户及缓存路径下传入空授权码,恢复设备凭证。离线启动仍取决于有效签名和授权策略;浮动授权和必须联网的启动需要服务器确认。

5. 验证允许与拒绝的操作

  1. 用测试授权码激活,检查实际生成的导出文件。
  2. 移除 LICENTIVO_LICENSE_KEY,用相同虚拟环境和操作系统用户重启,确认设备凭证被恢复。
  3. 将 LICENTIVO_FEATURE 设为许可证中不存在的功能,LICENTIVO_OUTPUT 设为新文件名。应返回非零退出码,且不生成新导出文件。
  4. 启用计次前先配置次数规则,设置 LICENTIVO_METERED=1,并为持久业务任务提供 LICENTIVO_OPERATION_ID。确认成功业务只扣一次。

排查安装与授权问题

检查产品 ID、每组密钥 ID 和公钥、客户输入的授权码。公钥属于产品;客户许可证和本机凭证分别管理。开发测试授权码和厂商管理 API Key 不进入客户安装包。

ModuleNotFoundError 通常是 pip 与应用使用了不同的 Python。安装和执行都用同一虚拟环境中的解释器。

许可证到期或功能被拒绝时必须停止业务,显示 SDK 错误及可用的请求编号,不要在检查失败后直接调用导出函数。

计次操作需要联网。保留稳定任务编号和持久结果,以便恢复待确认任务而不重复执行业务。不要分发签名缓存、设备凭证、测试授权码或厂商管理 Key。