PyArmor(パイアーマー)は、Pythonスクリプトを難読化して配布するためのコマンドラインツールです。「無料版のまま商用製品に使ってよいか」「Basic・Pro・Groupのどれを買えばよいか」で迷う人が多いため、この記事では公式のライセンス規約と価格表を先に整理します。そのあと無料版の制限をPyArmor 9.2.8で実行して確かめた結果、基本コマンド、7系からの移行、保護の限界の順に解説します。
まとめ:PyArmorの商用利用・ライセンス・価格の要点
- 商用利用は無料版でも可能です。ただし公式Q&Aは、売上がライセンス料の100倍を超えたら有料ライセンスを買うよう定めています。
- 価格はBasic 52ドル、Pro 89ドル、Group 158ドル(いずれも買い切り)、CI 90ドル/年です(2026年10月時点の公式ショッピングカート)。
- ライセンスは1製品につき1本です。数えるのは製品の種類で、配布本数や実行端末の数ではありません。
- 無料版では大きなスクリプト・文字列定数の難読化(
--mix-str)・RFT/BCCモードが使えず、9.2.8で試すとout of licenseで止まりました。 - 最新版は9.2.8(2026-10-22)で、Python 3.7〜3.15に対応します。
pyarmor obfuscateとpytransformは7系までの仕組みで、今はpyarmor genを使います。 - 難読化は復元を難しくする手段で、秘密情報の保管場所にはなりません。8.0〜9.2系を静的に逆アセンブルするOSSも公開されています。
PyArmorとは:仕組みと最新バージョン9.2.8
PyArmorは中国の開発者(dashingsoft)が公開している難読化ツールで、PyPIでは pyarmor パッケージとして配布されています。PyPI上のライセンス表記は「Free To Use But Restricted」で、OSSライセンスではありません。利用条件は公式ドキュメントの規約が正本です。
難読化したスクリプトは、一緒に生成されるランタイムパッケージ(試用版では pyarmor_runtime_000000)と組にして配布し、その中の拡張モジュールが実行時に復号します。PyArmor本体とライセンスが必要なのは難読化を行う「ビルド端末」だけです。実行端末にはPyArmorもライセンスも要りませんが、対応するPythonと依存ライブラリは通常のスクリプトと同じく用意します。
2026年10月時点の最新はGitHubのリリースで公開された9.2.8(2026-10-22)です。--enable-rft の名前変換の不具合4件(#2378〜#2393)の修正に加え、python -m pyarmor.cli.hdinfo が端末を「stable device」か「unstable device」かを表示するようになりました。ソースコード(src/cli/register.py)では、マシンIDが安定しない端末でGroupライセンスの端末登録を行うと group license not works in unstable device で止まります。Groupを使う予定のオフライン端末では、購入前に hdinfo の1行目を確認してください。
PyArmorの商用利用条件
商用利用の可否は、公式ドキュメントのLicense Typesにある Terms of Use と Q&A で決まります。要点は次の3つです。
無料版で商用利用できる範囲:売上がライセンス料の100倍まで
規約は「No profit no license required(利益がなければライセンス不要)」として、大きな収益を生まないスクリプトなら無料版で難読化してよいとしています。公式Q&Aでは、販売を始めたばかりの製品について「売上がライセンス料の100倍を超えるまでは試用版で難読化してよい、超えたら購入が必要」と回答しています。
基準となるライセンス料の種類は明記されていません。最安のBasicで換算すると5,200ドル(52ドル×100)です。社内ツールのように販売しないスクリプトは、まとめて「non-profits」という1製品として扱われます。
「1製品1ライセンス」の数え方
ライセンスは製品の種類ごとに1本です。公式は「Microsoft Excelは無数の端末にインストールされていても1製品」と例示しており、配布数や顧客数では増えません。開発・ビルド・テストに使う端末、旧版と将来の版も同じ製品に含まれます。
2製品を1本で済ませられるのは、一方が他方の機能をすべて含む場合(例:Basic版とPro版)や、一方が他方の補助ツールである場合です。顔認証エンジンと、それを使う勤怠管理システムのように機能の比重が大きく違うものは2本必要です。
例外として規約には「Fair use」の項があり、ライセンスを買った製品とは別の製品でも、その製品の売上がライセンス料の100倍未満なら同じライセンスを貸して使えるとしています。売上が伸びて100倍を超えた時点で、その製品用のライセンスを別途購入します。
難読化対象の権利条件と第三者コードの制限
有料ライセンスを買っていても、顧客のスクリプトを自社アプリから難読化する、Webで難読化サービスを提供する、といった使い方は禁止です。受託開発で納品物を難読化する場合は、スクリプトの権利が誰にあるかを契約で先に確認してください。
PyArmorのライセンスの種類と価格:Basic・Pro・Group・CIの比較
有料ライセンスは4種類です。価格は公式ショッピングカート、機能の差は License Types の比較表で確認できます。
| 項目 | 無料版 | Basic | Pro | Group | CI |
|---|---|---|---|---|---|
| 価格(USD) | 0 | 52 買い切り | 89 買い切り | 158 買い切り | 90 / 年 |
| 大きなスクリプト・文字列難読化 | × | ○ | ○ | ○ | ○ |
| BCC・RFTモード(不可逆難読化) | × | × | ○ | ○ | ○ |
| オフラインでの難読化 | ※ | × | × | ○ | × |
| CI/CDパイプラインで使用 | ○ | ○ | × | × | ○ |
| ローカルDockerの台数 | - | 上限内 | 上限内 | 無制限 | - |
| ビルド端末の上限 | 制限なし | 100台 | 100台 | 200台 | 0(CI専用) |
| 対応するPyArmor | 全版 | 8以降 | 8以降 | 8以降 | 9以降 |
※無料版のオフライン難読化は、公式の比較表では空欄、同じページのライセンス選定表では「Y」と記載が食い違っています。比較表の見出しは「BCC / RFT / FLY mode」ですが、FLYモードの説明は注記にありません。
RFTモードは関数・クラス・変数名を書き換え、BCCモードは一部の関数をC関数に変換して機械語にします。公式が「Irreversible Obfuscation(不可逆な難読化)」と呼ぶのはこの2つです。Basicでも基本の難読化と文字列定数の保護はできますが、RFTやBCCにはPro・Group・CIが必要です。
買い切りの範囲とバージョンアップ時の扱い
CI以外は買い切りで、購入時点のPyArmorのバージョンでは永続的に使えますが、将来のバージョンで動く保証はありません。8から9へ上げたときはライセンスの再アクティベートが必要です。BasicからProへの差額アップグレードも受け付けていないため、BCC/RFTを使う可能性があるなら最初からProを選ぶほうが安く済みます。
CI/CD・Docker環境でのライセンス選び
Dockerは起動のたびに新しいビルド端末として数えられるため、Basic/Proの登録ファイルをCIやコンテナで直接使うと上限100台をすぐに使い切ります。9.0のアップグレードノートによると、ProライセンスはPyArmor 9からCI/CDパイプラインで使えず、2024-10-20以降に購入したProは8系で使ってもCI/CDでは動きません。
CI/CDではBasicかCIライセンスを使い、ローカル端末で pyarmor reg -C pyarmor-regfile-xxxx.zip を実行してCI用の登録ファイル(pyarmor-ci-xxxx.zip)を発行します。CI用の登録ファイルは約360日で失効し、1ライセンスあたり100個まで発行できます。RFT/BCCもCIで使うならCIライセンスです。CIライセンスには毎秒1回・毎時100回・毎日1,000回・毎月10,000回の実行上限があり、専用ディスクを持つランナーでは動かないため、ランナーがDockerコンテナでない場合はProを使うよう公式は案内しています。ネットワークから切り離した環境やローカルのDockerを大量に使う構成はGroupが対象です。
返金とサポートの条件
公式の返金条件は購入から30日以内で、アクティベーションファイルをまだ使用していないことです(手数料5%がかかる場合あり)。公式は「試すためにライセンスを買わず、無料版で試す」よう求めています。ライセンス料は機能の解除だけが対象で技術サポートは含まれず、不具合報告はGitHubのIssueで受け付けています。
無料版(試用版)の制限:PyArmor 9.2.8での実行結果
無料版に期限はありませんが、機能は制限されています。macOS(x86_64)とPython 3.9.6の環境で、pip install pyarmor==9.2.8 の試用版を使って確かめた結果が次の表です。
| 試した操作 | 結果 |
|---|---|
小さなスクリプトを pyarmor gen |
成功・実行可 |
30文字の文字列定数を含むファイルに --mix-str |
out of license |
短い文字列だけのファイルに --mix-str |
成功 |
--enable-rft / --enable-bcc |
out of license |
| 関数200個(7,795バイト) | 成功 |
| 関数250個(9,795バイト) | out of license |
| 関数なしの800行(14,992バイト) | 成功 |
公式は「大きなスクリプト」の境目を「ファイルサイズが一定値を超えるもの」としか説明していません。実測では、関数を含む9.8KBのファイルが止まる一方で、関数を含まない15KBのファイルは通りました。--mix-str も、保護の対象になる文字列定数が無いファイルではエラーになりません。9.2.7でも同じ手順で同じ結果でした。ソースのバイト数や指定したオプションだけでは決まらないため、自分のコードで pyarmor gen を試すのが確実です。
試用版で難読化したファイルの先頭には Pyarmor 9.2.8 (trial), 000000, non-profits というコメントが入ります。有料版ではライセンス番号と登録した製品名が埋め込まれます(それ以外の登録情報は入らないと公式は説明しています)。
PyArmorのインストールと基本の使い方
インストールと難読化・実行の手順
難読化する foo.py を現在のフォルダに用意してください。例えば内容を print("Hello") とすると、次の3行でインストール・難読化・実行を試せます。
python -m pip install pyarmor==9.2.8
python -m pyarmor.cli gen foo.py
python dist/foo.py
python -m pyarmor.cli は pyarmor コマンドと同じ働きで、以降は pyarmor と書きます。dist には難読化後の foo.py と pyarmor_runtime_000000 フォルダ(__init__.py と拡張モジュール)ができます。配布時はこのフォルダも同梱します。パッケージ全体を対象にするときは pyarmor gen -r src/mypkg のように -r で再帰させます。
有効期限・端末固定などの制限オプション
難読化したスクリプトには、実行できる期間や端末を埋め込めます。
# 30日で期限切れ
pyarmor gen -e 30 foo.py
# 日付で期限を指定
pyarmor gen -e 2026-12-31 foo.py
# MACアドレスで端末を固定(IPv4・ディスクのシリアル番号も可)
pyarmor gen -b 52:38:6a:f2:c2:ff foo.py
# 固定に使える端末情報を確認(9.2.8からstable/unstableも表示)
python -m pyarmor.cli.hdinfo
-e に過去の日付を入れて試すと、実行時に RuntimeError: this license key is expired で止まりました。既定の期限判定は実行端末のローカル時刻です。利用者が時計を戻すと回避できるため、期限を厳密に守らせるなら pyarmor cfg nts=pool.ntp.org でネットワーク時刻を参照させます。
外部キーで期限を後から差し替える手順
-e で埋め込んだ期限は、延長するたびに難読化し直して再配布することになります。スクリプト本体と期限を分けたいときは、--outer で難読化し、期限や端末の条件を書いた外部キー pyarmor.rkey を別に渡します。9.2.8の試用版で次の順に動かしました。
# 外部キー前提で難読化(キーが無いと実行できない)
pyarmor gen -O dist --outer foo.py
# 期限30日の外部キーを作り、ランタイムのフォルダに置く
pyarmor gen key -O keys -e 30
cp keys/pyarmor.rkey dist/pyarmor_runtime_000000/
python dist/foo.py
キーを置かずに実行すると RuntimeError: missing license key to run the script、期限切れのキーでは this license key is expired で止まり、新しいキーに差し替えると同じ難読化済みファイルがそのまま動きました。外部キーは -e か -b の少なくとも一方が必須です。置き場所はランタイムのフォルダのほか、環境変数 PYARMOR_RKEY のパスやカレントディレクトリも探索されると公式のMan Pageなどに書かれています。顧客ごとに期限だけ変えて渡す運用に向きます。
PyInstallerと組み合わせた配布
8.5.4以降は pyarmor gen --pack onefile foo.py の1コマンドで、難読化とPyInstallerによる単一実行ファイル化までを行えます(onedir も指定可能で、specファイルの指定は8.5.8以降に対応)。先にPyInstallerで実行ファイルを作ってから差し替える旧手順は非推奨になりました。PyInstallerは別途インストールが必要です。GUIアプリをまとめて配布する場合、PySide6などGUIライブラリ側のライセンス条件も別に確認が要ります(PySide6のライセンスと商用利用の条件を参照)。
ライセンスの購入と登録手順
日本からの購入:公式カートと国内代理店
公式カートは中国以外からの支払いがPayPalのみで、請求書は既定では発行されません。PDFの請求書が必要なら、支払い完了後の画面にある申請フォームから依頼します。購入時に入力する「License To」(個人名か会社名・6〜80文字)と「Bind Product」(保護する製品名・6〜60文字)は、そのままライセンスに結び付きます。GroupとCIは、ライセンスキーの送付先に企業ドメインのメールアドレスが必要です。キーは支払い後1時間ほどでメールで届きます(8.6以降は pyarmor reg --buy でもカートを開けます)。
見積書や銀行振込、法人の掛け売りが必要な場合は、国内代理店のUNIPOSが窓口です。UNIPOSの製品ページはGroupの参考税込価格を37,400円とし、Basic・Pro・CIの価格は問い合わせとしています(2026年10月時点)。
登録:製品名の決め方とバックアップ
購入するとアクティベーションファイル pyarmor-regcode-xxxx.txt が届くので、製品名を付けて初回登録します。
# 初回登録(製品名はあとから変更できない)
pyarmor reg -p "製品名" pyarmor-regcode-xxxx.txt
# Basic・Proの2台目以降は生成された登録ファイルで登録
pyarmor reg pyarmor-regfile-xxxx.zip
# 登録内容の確認
pyarmor -v
初回登録で生成される pyarmor-regfile-xxxx.zip は紛失しても再発行されないため、必ずバックアップします。Basic/Proでは、製品名が決まっていない段階で -p "TBD" を指定して登録でき、6か月以内に一度だけ正式名を設定できます。設定しないまま6か月を過ぎると「non-profits」になり、以後変更できません。Basic/Proは難読化のたびにオンラインでライセンスを照合し、その際ディスクのシリアル番号やMACアドレス、ホスト名が送信されます(スクリプト本体は送られません)。
PyArmor 7系(pytransform・obfuscate)からの移行
検索すると今も pyarmor obfuscate や pytransform を使う解説が上位に出てきますが、これは7系までの仕組みです。8.0でコマンド体系が gen ・ reg ・ cfg などに刷新され、9.2.8で pyarmor obfuscate を実行すると invalid choice: 'obfuscate' で止まります。旧記事の手順は次のように読み替えます。
| 7系の書き方 | 8系以降の書き方 |
|---|---|
pyarmor obfuscate main.py |
pyarmor gen main.py |
obfuscate --recursive |
gen -r |
licenses --expired 2026-12-31 r001 |
gen key -e 2026-12-31 |
obfuscate --with-license ... |
gen --outer +外部キー |
pytransform フォルダ |
pyarmor_runtime_000000 フォルダ |
pyarmor register |
pyarmor reg |
7系の動作がどうしても必要な場合は、同じパッケージに入っている pyarmor-7 コマンドが使えます。9.2.8の試用版でも pyarmor-7 obfuscate は動き、pytransform フォルダ付きの出力ができました。ただし pyarmor-7 は旧ライセンス(Old License)用で、8以降のライセンスで使うとHTTP 401エラーになることがあります。Python 3.11以降は7系の対象外で、Python 3.6以前を動かす必要がある場合だけ旧ライセンスを検討します。旧ライセンスは条件によって pyarmor reg -u でBasicへ移行できます。
対応するPythonとOS、バージョン不一致のエラー
公式の対応表では、8系以降の pyarmor gen はPython 3.7〜3.15が対象で、Windows(x86/x86_64)、macOS(x86_64・Apple Silicon)、Linux(x86/x86_64・aarch64・armv7)、FreeBSD、Alpine Linux、Androidに対応します。9.2.8に同梱される pyarmor.cli.core 8.1.2には、Python 3.15用(cp315)のホイールも含まれています。
注意したいのは、難読化したスクリプトは難読化に使ったPythonのマイナーバージョンでしか動かない点です。Python 3.9で難読化したファイルをPython 3.14で実行すると、ImportError: ... symbol not found in flat namespace '_PyCode_NewWithPosOnlyArgs' で読み込みに失敗しました。配布先のPythonが決まっているなら、ビルド端末のPythonを同じマイナーバージョンに揃えます。OSやCPUが異なる端末向けには、--platform で対象プラットフォームを指定して難読化します。ただし、Apple SiliconはPython 3.9以降が対象で、利用できる機能もOS・CPUによって異なります。
PyArmorの保護範囲と解析・改変への限界
公式ドキュメントは「不可逆な難読化により元に戻せない」と述べる一方で、「メモリ保護とアンチデバッグは得意ではない」とも認めています。デバッガで pyarmor_runtime を追っても元のスクリプトは戻せないが、ランタイムキーの検証(期限・端末固定)は回避され得る、というのが公式の説明です。オプション次第で強度も大きく変わり、公式は --obf-code 0 ・ --obf-module 0 に加えて pyarmor cfg restrict_module=0 を設定した構成を「.pycとほぼ同じ強度」としています。
GitHubでは「Pyarmor Static Unpack One-Shot」(GPL-3.0)が公開されており、READMEは8.0〜9.2系で難読化したデータを実行せずに逆アセンブルでき、ソースへの逆コンパイルも実験的に行えるとしています。こうしたツールがあることを前提に、次のように使い分けます。
- APIキーやパスワードをスクリプトに埋め込まない。難読化しても実行時にはメモリ上で平文に戻る
- 期限・端末固定は「うっかり流用」を防ぐ用途と割り切り、課金の根拠にするならサーバー側で認証する
- 重要なロジックはProのBCCモードでC関数化するか、サーバー側に置いてAPIとして提供する
配布物に入れたくない処理をサーバー側へ移す場合は、API化を含めたフルスクラッチ開発で設計し直す方法もあります。実行時の攻撃から守る仕組みを検討しているなら、RASP(実行時アプリケーション自己保護)の仕組みと導入判断も参考になります。
セキュリティ製品から疑われる配布物への備え
難読化はマルウェアも使う手口です。トレンドマイクロは2023年9月のBatloaderの分析記事で、検知を逃れる手口の1つとして「PyArmor Pro」によるPythonスクリプトの難読化を挙げています。難読化した製品を配布する側は、PyInstallerで作った実行ファイルへのコード署名、配布元の明示、配布前に複数のエンジンで判定を確かめる手順を用意しておくと、顧客環境で止められたときに説明できます。ただし、VirusTotalの通常サービスに送信したファイルは第三者に共有される場合があるため、未公開製品や機密情報を含む配布物を送信できるか事前に確認してください。判定の自動化はVirusTotal APIで検体判定を自動化する手順で扱っています。
PyArmor以外の選択肢との比較と使い分け
「python 難読化」で比較されるツールは、保護の方式がそれぞれ異なります。
| 手段 | 方式 | 最新版(PyPI) |
|---|---|---|
| PyArmor | バイトコードの暗号化+ランタイム | 9.2.8(2026-10) |
| Cython | C拡張モジュールにコンパイル | 3.3.0(2026-08) |
| Nuitka | C経由で実行ファイルにコンパイル | 4.3.1(2026-10) |
| PyInstaller単体 | 実行ファイルに同梱(難読化なし) | 6.22.3(2026-09) |
| pyminifier | 名前の短縮などソース変形 | 2.1(2014-05) |
PyInstaller単体はバイトコードを同梱するだけで、展開すれば中身を取り出せます。pyminifierは2014年の2.1が最後のリリースです。CythonやNuitkaは機械語にするぶん復元が難しく、高速化も期待できます(速度差はCython・Codon・Mojoの実測比較を参照)。その代わりビルド環境の構築や型まわりの調整が必要になります。
PyArmorを採用すべきでないのは次の場合です。売上規模が大きいのにライセンス費を払えない(規約違反になる)、配布先のPythonバージョンを揃えられない(実行時に読み込めない)、顧客のコードを預かって難読化する(規約で禁止)。逆に、既存のPythonコードを大きく変えずに配布物を守りたい小規模の製品では、まず無料版で動作と制限を確認し、必要な機能に応じてBasicかProを選びます。
PyArmorの商用利用に関するよくある質問
PyArmorは商用利用できますか?
できます。公式Q&Aは、売上がライセンス料の100倍を超えるまでは試用版で製品を難読化してよいとしています。超えた時点で有料ライセンスが必要です。ただし無料版では大きなスクリプトと文字列定数の難読化が使えないため、機能面で先に購入が必要になることもあります。
PyArmorのライセンス価格はいくらですか?
2026年10月時点の公式カートでは、Basic 52ドル、Pro 89ドル、Group 158ドル(いずれも買い切り)、CI 90ドル/年です。円建ての見積や銀行振込が必要なら国内代理店のUNIPOSに依頼します。
Basic・Pro・Groupはどう選べばよいですか?
文字列の難読化と大きなスクリプトに対応できればよいならBasic、不可逆な難読化(BCC・RFTモード)が必要ならPro、ネットワークに接続できない環境で難読化するならGroupです。CI/CDでRFT・BCCを使うならCIを選びます。差額アップグレードはできません。
ライセンスを買うと配布先の端末数に制限はありますか?
ありません。ライセンスはPyArmorをインストールするビルド端末(Basic/Proは100台まで)にだけ適用されます。公式Q&Aも、難読化したスクリプトをKubernetesのPodにいくつ配置しても制限はないと回答しています。
PyArmorで難読化したコードは解読されますか?
8.0〜9.2系の難読化データを逆アセンブルするOSSが公開されており、完全な保護ではありません。公式もメモリ保護とアンチデバッグは得意でないと認めています。秘密情報は埋め込まず、重要なロジックはサーバー側に置く設計と組み合わせてください。