본문 바로가기
RV

Open RV에서 Python 활용하기 (레퍼런스 매뉴얼 4장 요약)

by 르면가게 2025. 2. 9.

🔹 Open RV에서 Python을 사용하는 이유

Open RV는 기본적으로 Mu 스크립팅 언어를 사용하지만, Python을 활용하여 RV의 기능을 확장하고 자동화할 수 있습니다. Python은 Mu와 동등한 수준으로 지원되며, Python과 Mu를 상호 호출하는 것도 가능합니다.

Python을 RV에서 사용하는 이유:

  1. 강력한 확장성 – RV의 기능을 커스터마이징하고 자동화 가능
  2. Mu보다 친숙한 환경 – 기존 Pythn 개발자에게 익숙한 문법 제공
  3. RV 내부 모듈 직접 제어 가능 – rv.commands, rv.extra_commands, rv.rvtypes, rv.rvui 등의 API 활용

1️⃣ RV에서 Python 기본 사용법

RV에서 Python을 사용하려면 "모드(Mode)" 를 생성해야 하며, 이는 RV 패키지(rvpkg) 내에서 이루어집니다.

🔹 간단한 Python 모드 예제

아래 예제는 Z 키를 누르면 재생/정지를 토글하는 기능을 추가하는 Python 모드입니다.

import rv.rvtypes
import rv.commands

class PyHello(rv.rvtypes.MinorMode):
    """간단한 재생/정지 토글 기능 추가"""

    def togglePlayback(self, event):
        if rv.commands.isPlaying():
            rv.commands.stop()
        else:
            rv.commands.play()

    def __init__(self):
        rv.rvtypes.MinorMode.__init__(self)
        self.init("pyhello", [("key-down--Z", self.togglePlayback, "Z 키")], None)

def createMode():
    """RV가 모드를 생성할 때 호출하는 함수"""
    return PyHello()

✅ 위 코드를 실행하면, Z 키를 누를 때마다 RV의 미디어가 재생/정지됨


2️⃣ Python에서 Mu 호출하기

RV는 Mu와 Python 간의 상호 호출을 지원합니다. Mu에서 Python 함수 실행하거나, Python에서 Mu 함수를 호출할 수 있습니다.

🔹 Python에서 Mu 함수 호출 예제

Python에서 Mu 함수를 실행하려면 pymu.MuSymbol 을 사용합니다.

from pymu import MuSymbol

# Mu의 "commands.play()" 함수 호출
F = MuSymbol("commands.play")
F()  # RV에서 미디어 재생 실행

Mu 함수에서 반환값을 받는 예제

from pymu import MuSymbol

is_playing = MuSymbol("commands.isPlaying")  # 재생 중인지 확인하는 Mu 함수
set_title = MuSymbol("commands.setWindowTitle")  # RV 윈도우 타이틀 변경 함수

if is_playing():
    set_title("PLAYING")  # RV 타이틀을 "PLAYING"으로 변경

3️⃣ Mu에서 Python 호출하기

Mu에서도 Python 모듈을 불러와 Python 코드를 실행할 수 있습니다.

🔹 Mu에서 Python 함수 호출 예제

require python;

let pyModule = python.PyImport_Import("os");
let pyMethod = python.PyObject_GetAttr(pyModule, "getcwd");
string result = to_string(python.PyObject_CallObject(pyMethod, python.PyTuple_New(0)));

print("현재 작업 디렉터리: %s\\n" % result);

✅ 위 코드는 Python의 os.getcwd()를 Mu에서 호출하여 현재 작업 디렉터리를 출력합니다.


4️⃣ Python과 Mu 간 데이터 변환

Python과 Mu는 데이터 타입이 다르므로, 서로 변환 과정이 필요합니다.

🔹 Mu → Python 변환 테이블

Mu 타입 Python 변환 타입
string str (유니코드 문자열)
int, short, byte int
int64 long
float, double float
bool bool
vector float[2] (float, float) (튜플)
vector float[3] (float, float, float) (튜플)
vector float[4] (float, float, float, float) (튜플)
dictionary dict (Python 딕셔너리)
list list (Python 리스트)

예제: Python에서 Mu 함수 호출 및 데이터 변환

from pymu import MuSymbol

F = MuSymbol("commands.getFrameRange")
frame_range = F()  # (시작 프레임, 종료 프레임) 튜플 반환

print(f"현재 프레임 범위: {frame_range[0]} ~ {frame_range[1]}")
  • Mu의 getFrameRange() 함수는 튜플로 변환되어 Python에서 사용 가능

5️⃣ PySide를 활용한 RV UI 확장

RV는 PySide2(Qt) 기반으로 GUI를 구성합니다. 따라서 PySide를 사용하여 RV 인터페이스를 확장할 수 있습니다.

🔹 PySide를 활용한 간단한 예제

#!/Applications/RV.app/Contents/MacOS/py-interp

import sys
from PySide2.QtWidgets import QApplication, QLabel

app = QApplication.instance()
if app is None:
    app = QApplication(sys.argv)

label = QLabel("RV PySide2 UI")
label.show()

app.exec_()
sys.exit()

위 코드는 RV 내부에서 PySide2를 활용하여 간단한 라벨을 표시

🔹 RV 내부 UI 컨트롤 가져오기

import rv.qtutils

# RV의 세션 창 가져오기
rvSessionWindow = rv.qtutils.sessionWindow()

# RV의 OpenGL 뷰 가져오기
rvSessionGLView = rv.qtutils.sessionGLView()

# RV의 상단 및 하단 툴바 가져오기
rvSessionTopToolBar = rv.qtutils.sessionTopToolBar()
rvSessionBottomToolBar = rv.qtutils.sessionBottomToolBar()

RV의 기존 UI 요소를 PySide2로 컨트롤 가능


6️⃣ Python 활용 시 주의사항 (FAQ)

✅ OpenGL을 사용하여 화면에 그릴 수 있나요?

가능합니다. PyOpenGL을 사용하면 Mu에서 수행하는 OpenGL 작업을 Python에서도 실행할 수 있습니다.

✅ rv.commands.bind()가 Mu와 다르게 동작하나요?

Python에서는 모든 인자를 명시적으로 전달해야 합니다.

bind("default", "global", event, func, event_doc_string)

✅ RV에서 실행한 Python 코드가 외부에서 다르게 동작하는 이유는?

RV는 PYTHONPATH를 변경하여 실행됩니다.

이를 해결하려면 QProcess.setEnvironment()를 사용하여 환경 변수를 명시적으로 설정해야 합니다.


🔹 마무리

RV에서 Python을 사용하면 강력한 자동화 및 확장 기능을 활용할 수 있습니다.

  • RV API(rv.commands, rv.rvtypes)를 활용하여 RV의 모든 기능을 제어 가능
  • Mu와 Python 간 상호 호출 지원 → 기존 Mu 코드 활용 가능
  • PySide2(Qt) UI 확장을 통해 RV의 UI를 직접 제어 가능

Python을 활용하여 자신만의 RV 기능을 커스터마이징해 보세요! 🚀

https://aswf-openrv.readthedocs.io/en/latest/rv-manuals/rv-reference-manual/rv-reference-manual-chapter-four.html