備忘録として ReaScript を Python3 で書く時に躓いたところをメモしておきます。
これらの動作は Reaper のバージョンによっても変わりますのでご注意下さい。
REAPER 64bit 版なら Python3 も 64bit 版を
当たり前ですが、忘れがちなので、 OS に合わせて Python3 も変更して下さい。
最初に呼び出されるファイルのエンコードはシステム既定に
ReaScript として実行するファイルは、システム既定のエンコード(日本語版 Windows だと CP932 / Shift JIS) である必要があります。通常 Python3 で使用するように UTF-8 でエンコードされたソースは、たとえ日本語がコメントに含まれる程度であっても実行できません。ファイルのエンコードは CP932 / Shift JIS を使用するか、文字の使用を ASCII の範囲内に留めておくのが安心でしょう。
ただし、自作のモジュールなど import される側には、制限がありません。ただし、import される側のファイルではエンコードの指定が必要ですので、1行目に、例えば以下のように、マジックコメントを書いておきましょう。くわしくは PEP0263 参照。
# -*- coding: utf8 -*-
自作のモジュールを import をするときに必要なこと
上記の coding 指定の他に、REAPER の関数を使用する場合には、reaper_python モジュールの import が必要です。よって、自作のモジュールは通常以下の文ではじまります。
# -*- coding: utf8 -*-
from reaper_python import *
sys.argv は取得できない
おそらく REAPER の内部でスクリプトが実行されるため、 sys.argv を取得することができません。そのため、スクリプト本体の位置を取得する方法が存在しません。os.getcwd() で取得できるカレントディレクトリもスクリプトの位置ではないため、注意が必要です(ただし、スクリプト位置基準の相対指定の import は使用出来ます)。
tkinter は使用出来ない
上記の sys.argv と関連し、それを使用するモジュール、たとえば tkinter はエラーが出て使用出来ませんでした。
print() は使用出来ない
コンソールが存在しないので、代わりに RPR_ShowConsoleMsg() を使用して下さい。
quit() や exit() は使用出来ない
REAPER ごと落ちるので、使わないで下さい。
めんどくさい or 他のプログラムを活用したい or 他の言語が良い
他の人の環境で使うときにはパスの指定など、一手間かかってしまいますが、REAPER の関数を使用しない部分を、パイプなどを使用して外部に任せるのをおすすめします。たとえば以下のようにします。
import subprocess
data = subprocess.check_output([r"c:\python\python.exe", r"c:\script.py"]).decode("sjis")
こうすると script.py のなかで print() されたもの sys.stdout.write() されたものが返ってきます。たとえば、dict() に適当なものを詰め込んで repr() して返して、受け取った側で eval(data) すればばっちりです。
REAPER の関数リファレンスは?
私もよくしらないので、ヘルプのHTMLリストの ReaScript の説明を見るか、REAPER 上で以下のアクションを実行してください。
[developer] Write C++ API functions header
そこで出てきた関数名に、RPR_ を付ければ Python から使用出来ます。
REAPER 上のコマンドの実行方法は?
アクション一覧から、アクションの番号を調べて、 RPR_Main_OnCommand() を実行して下さい。
RPR_Main_OnCommand(アクション番号, 0)
日本語情報は?
ほぼないので、何かに躓いたら Twitter で私に聞いてみてください。(答えられないことの方がたぶんおおいです)
最近のコメント