Metadata-Version: 2.4
Name: ixi
Version: 1.0.106
Classifier: License :: Other/Proprietary License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Dist: certifi>=2024.0.0
Requires-Dist: packaging>=24.0
Summary: Encrypt Python scripts and execute decrypted code.
Keywords: encryption,script-protection
Author: 3iXi
License-Expression: LicenseRef-Proprietary
Requires-Python: >=3.10
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM

# ixi

`ixi` 用于加密 Python 脚本，并生成可执行的加密启动脚本。运行时只在内存中解密并执行，不落盘明文。

## 安装

```bash
pip install --only-binary=:all: ixi
```

## 命令

- `ixi -v`：输出当前版本号
- `ixi -e script.py`：以默认 `compat` 模式加密脚本并输出 `script_<timestamp>.py`
- `ixi -e script.py --mode bytecode`：以 `bytecode` 强保护模式加密脚本，运行时不恢复源码文本，但产物绑定加密时的 CPython cache tag 和 magic number（会导致加密后脚本只能在同版本Python上才能运行...一般不建议使用）

## 明文配置区

- 加密时会检查明文脚本前 `200` 行。
- 若检测到成对出现的配置标记行，就会把整段配置区从加密主体中移出，并保留在产物脚本中明文显示，方便最终用户直接修改。
- 标记行需要以 `#` 开头，并以连续的 `=` 或 `-` 作为装饰边界；下一条同类标记行会被视为结束标记。例如：

```python
# ===== 自定义配置 =====
FEATURE_FLAG = True
TIMEOUT = 300
# ==========
```

- 运行加密脚本时，这段明文配置会先执行，再执行后面的加密主体，因此修改后的值会立即生效。
- 若只找到开始标记、没找到结束标记，会打印警告并回退为“完整加密”，不会移动这段配置区。

## 运行时行为

- 启动脚本会先尝试 `import ixi`。
- 若导入失败，自动按 `python -m pip`、当前解释器目录下的 `pip/pip3`、`uv pip install --python 当前解释器` 的顺序尝试安装，并依次尝试默认源、中科大官方 simple 源、旧跳转兼容地址与官方 PyPI simple 源。
- 若本地 `ixi` 低于云端最新版，启动脚本会用同样的 pip/uv 兼容安装方式，按默认源、中科大官方 simple 源、旧跳转兼容地址、官方 PyPI simple 源的顺序尝试自动升级；升级成功后重启当前脚本以加载新版运行时。
- 解密前会优先请求中科大官方 simple API 检查版本：
  - `GET https://mirrors.ustc.edu.cn/pypi/simple/ixi/`
  - 若官方地址不可用，会回退兼容旧地址 `https://pypi.mirrors.ustc.edu.cn/simple/ixi/`
  - `Accept: application/vnd.pypi.simple.v1+json`
  - TLS 信任根固定为 `certifi`（Mozilla CA Bundle），不使用系统证书库。
  - 运行时额外要求对端证书签发组织为 `Let's Encrypt`。
- 若版本检查请求失败（包括 404、网络错误或镜像拒绝访问），打印警告后继续按当前脚本要求的最低运行时版本执行。
- 本地版本低于最新版且自动升级失败时，打印告警并终止执行。
- 自动安装失败时会输出 `machine/libc/python` 诊断信息，便于定位 wheel 标签不匹配问题（例如 Alpine/musl 环境缺少 `musllinux` 产物）。

