執筆者:菅原
インタラクティブコンテンツ制作会社を経てモノリスソフトへ入社。 以来、テクニカルアーティストとして主にMayaツール開発の業務を担当。 好きな食べものはごはん。
TECH BLOG
![]()
こんにちは。モノリスソフト テクニカルアーティストの菅原です。
先日Photoshopのツールを作成する機会があったのですが、その際にPythonでもPhotoshopのツールを作れるらしいということを知り、UI作成・保守の観点からPythonでの実装を行いました。
今回の記事は備忘録を兼ねたPythonでPhotoshopツールを作成する際の開発環境・パッケージ構成のまとめとなります。
サンプルファイル(monolithtech_photoshop_tool.zip 6.9 KB)はこちらです。
Githubで検索すると有志により作成されたPhotoshopのPythonAPIがいくつかヒットします。
今回はその中からphotoshop-python-apiを選択しました。
こちらは2026年現在でも管理されており、ドキュメントにサンプルが豊富なため非常にわかりやすかったです。
また今回はデザイナーに配布するツールを想定し、UI作成にPySide6・Python環境不要で実行するためにexe形式で配布するのでPyInstallerを使用します。
Python3.13・上記パッケージを全てインストールしたのち「pip list」からインストール済みパッケージを確認すると、作業時点では依存しているものを含め以下のパッケージがインストールされている状態になります。
Package Version ------------------------- --------- altgraph 0.17.5 comtypes 1.4.16 packaging 26.2 pefile 2024.8.26 photoshop-python-api 0.24.2 pip 26.1.2 pyinstaller 6.21.0 pyinstaller-hooks-contrib 2026.6 PySide6 6.11.1 PySide6_Addons 6.11.1 PySide6_Essentials 6.11.1 pywin32-ctypes 0.2.3 setuptools 82.0.1 shiboken6 6.11.1 wheel 0.45.1
ツールとなるPythonパッケージは以下のようなファイル構成とします。
PHOTOSHOP_TOOL_SAMPLE │ __init__.py │ __main__.py │ run_ver2025.jsx │ run_ver2026.jsx │ utils.py │ [適宜ツールのPythonスクリプトを作成・追加...] │ ├─py_installer │ build.bat │ └─ui __init__.py form.ui ui2py.bat ui2py.py ui_form.py
この構成で重要なのは以下の3つです。
| __main__.py | Python環境でのツール起動スクリプト |
|---|---|
| build.bat | PyInstallerでexe形式にビルドするバッチ |
| run_ver~.jsx | Photoshopバージョンごとのツール起動スクリプト |
photoshop-python-apiのドキュメントにあるサンプルコードを実行してみるとわかるのですが、こちらのPythonAPIを使用すると実際にPhotoshopが起動し、ツールで行った処理がPhotoshop上に反映されるようになります。
まずはphotoshop-python-apiを使用してPython環境でツールを起動したときに問題なく動作するツールを作成してください。
ツールを作成する際の注意点として、複数バージョンのPhotoshopがインストールされているPCで処理を実行する場合、photoshop-python-api処理時にバージョンの指定を行わないと正しく実行されないことがあります。
今回は後述のPhotoshopバージョンごとのツール起動スクリプトで環境変数を設定し、その環境変数をツール起動時に読み込むことでバージョンの指定を行います。
photoshop.Session(Photoshopとの接続処理)実行時にバージョン情報を指定する必要があるため、静的関数でバージョン情報を設定した後は常に同じバージョン情報を使用するクラスを作成しました。
# -*- coding: utf-8 -*- import os import sys sys.path.append(os.path.join(os.path.dirname(__file__), '..')) from photoshop import api from PySide6 import QtWidgets, QtCore from photoshop_tool_sample import qt, utils if __name__ == '__main__': qt_app = QtWidgets.QApplication(sys.argv) # 起動済みPhotoshopから起動用スクリプトで起動しているか確認 ps_version = os.environ.get('__PS_VERSION', '') if not ps_version: dlg = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Icon.Warning, 'warning', 'Photoshopの起動用スクリプトから実行してください。') dlg.setWindowFlags(dlg.windowFlags() | QtCore.Qt.WindowStaysOnTopHint) dlg.exec() sys.exit(1) # 起動しているバージョンと環境変数のバージョンが一致しているか確認 ps_app = api.Application() if int(ps_app.version[:2])-1 != int(ps_version[2:]): dlg = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Icon.Warning, 'warning', '起動用スクリプトのバージョンが正しくありません。') dlg.setWindowFlags(dlg.windowFlags() | QtCore.Qt.WindowStaysOnTopHint) dlg.exec() sys.exit(1) utils.VersionSession.set_version(ps_version) win = qt.PhotoshopSampleTool() win.show() sys.exit(qt_app.exec())
# -*- coding: utf-8 -*- import photoshop from PySide6 import QtWidgets, QtCore class VersionSession(photoshop.Session): """Photoshopのバージョン情報を保持してSession作成 """ __PHOTOSHOP_VERSION = '2025' @staticmethod def set_version(ps_version): VersionSession.__PHOTOSHOP_VERSION = ps_version @staticmethod def get_version(): return VersionSession.__PHOTOSHOP_VERSION def __init__(self): super(VersionSession, self).__init__(ps_version=VersionSession.__PHOTOSHOP_VERSION)
Python環境で問題なく動作するツールが作成できた後は、そのツールをPython環境不要で起動できるようにするためPyInstallerでexe形式にビルドします。
setlocal cd /d %~dp0 ::show console ::pyinstaller -D -y -n photoshop_tool_sample ../__main__.py ::hide console pyinstaller -D -y -w -n photoshop_tool_sample ../__main__.py endlocal
今回はPython環境でのツール起動スクリプトが__main__.pyのため、バッチファイル内で親階層の__main__.pyを指定しています。
別のファイルをツール起動スクリプトとした場合は、適宜書き換えて下さい。
ビルドが完了するとpy_installer/distに出力されたフォルダにツールのexeとその他必要なファイルが生成されます。
上記build.batの場合は-n引数でフォルダ・exeの名前を指定しているので、py_installer\dist\photoshop_tool_sample に以下のように出力されます。
配布の際には出力されたフォルダごと配布しましょう。
PY_INSTALLER\DIST └─photoshop_tool_sample │ photoshop_tool_sample.exe │ └─_internal └─exeを起動するのに必要な諸々のデータ
Photoshopからexe形式にビルドしたツールを起動したいので、Photoshopから実行するPhotoshopバージョンごとの起動用スクリプトを作成します。
前述のPython環境でのツール起動スクリプトでPhotoshopのバージョン情報を取得するため、この起動スクリプトで環境変数を設定します。
// Photoshopから呼ばれるツール起動用スクリプト var script_file = File($.fileName); // Photoshopバージョン情報を環境変数に設定 $.setenv("__PS_VERSION", "2025") var tool_exe = File(script_file.parent.fsName + "/py_installer/dist/photoshop_tool_sample/photoshop_tool_sample.exe"); tool_exe.execute();
今回のツールはjsxスクリプトから起動したとしても、実際には独立したexeがPhotoshopに接続して処理を行っている状態になります。
そのためツールがPhotoshopから起動する前提となっている場合は、Photoshop画面の後ろに隠れないように最前面フラグを有効化すると使いやすくなるかもしれません。
class PhotoshopToolDialog(QtWidgets.QDialog): """Photoshopツール基本設定 """ def __init__(self, parent=None): super(PhotoshopToolDialog, self).__init__(parent) self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
今回はPythonでPhotoshopのツールを作成する際の開発環境・パッケージ構成をまとめてみました。
Photoshopでツールを作る際の作成の参考になれば幸いです。
GitHub - loonghao/photoshop-python-api: Python API for Photoshop.
執筆者:菅原
インタラクティブコンテンツ制作会社を経てモノリスソフトへ入社。 以来、テクニカルアーティストとして主にMayaツール開発の業務を担当。 好きな食べものはごはん。