맥북에서 파이썬 코드 단축키로 실행하기: Raycast Script Command 완벽 가이드

맥에서 자주 쓰는 파이썬 스크립트를 매번 터미널 열어서 실행하는 게 번거로우신가요? Raycast를 활용하면 단축키 하나로 파이썬 코드를 실행할 수 있어요.


검은색 배경에 빨간색 기하학적 도형으로 구성된 Raycast 애플리케이션 로고. 중앙의 정사각형을 중심으로 대각선 방향으로 점선 형태의 디자인 요소가 배치되어 있음.


Script Command로 5분 만에 파이썬 실행 버튼 만들기


가장 빠른 방법은 Script Command를 활용하는 거예요. 먼저 실행하고 싶은 파이썬 파일을 만들어볼게요.


# ~/scripts/daily_report.py
import datetime
import requests

def generate_report():
    today = datetime.datetime.now().strftime("%Y-%m-%d")
    print(f"📊 {today} 일일 리포트 생성 완료!")
    
    # 여기에 실제 작업 코드 추가
    # API 호출, 데이터 처리, 파일 생성 등
    
if __name__ == "__main__":
    generate_report()


이제 이 파이썬 코드를 Raycast에서 실행할 Shell 스크립트를 만들어요.


#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Daily Report Generator
# @raycast.mode compact

# Optional parameters:
# @raycast.icon 📊
# @raycast.packageName Python Scripts

python3 ~/scripts/daily_report.py


파일을 daily_report.sh 로 저장하고 실행 권한을 부여해요.


chmod +x daily_report.sh


Raycast를 열고 Extensions → Script Commands로 이동해서 방금 만든 스크립트를 추가하면 끝이에요. 이제 Raycast에서 Daily Report를 검색하면 바로 실행할 수 있어요.


입력값을 받는 스크립트 만들기


사용자 입력을 받아서 처리하는 스크립트도 간단하게 만들 수 있어요.


#!/bin/bash

# @raycast.schemaVersion 1
# @raycast.title Create Python Project
# @raycast.mode compact
# @raycast.argument1 { "type": "text", "placeholder": "Project name" }

project_name=$1

# 프로젝트 디렉토리 생성
mkdir -p ~/projects/"$project_name"
cd ~/projects/"$project_name"

# 가상환경 설정
python3 -m venv venv
source venv/bin/activate

# 기본 파일 생성
cat > main.py << EOF
#!/usr/bin/env python3
"""
$project_name - Created on $(date +%Y-%m-%d)
"""

def main():
    print("Hello from $project_name!")

if __name__ == "__main__":
    main()
EOF

# requirements.txt 생성
touch requirements.txt
touch README.md

echo "✅ Python project '$project_name' created successfully!"


커스텀 확장으로 고급 기능 구현하기


더 복잡한 UI나 상호작용이 필요하다면 TypeScript로 커스텀 확장을 개발할 수 있어요. Node.js의 child_process를 사용해서 파이썬 스크립트를 실행하는 방식이에요.


import { Action, ActionPanel, List, showToast, Toast } from "@raycast/api";
import { exec } from "child_process";
import { promisify } from "util";

const execAsync = promisify(exec);

export default function Command() {
  const runPythonScript = async (scriptName: string) => {
    try {
      const { stdout } = await execAsync(`python3 ~/scripts/${scriptName}`);
      await showToast({
        style: Toast.Style.Success,
        title: "Script Executed",
        message: stdout.trim()
      });
    } catch (error) {
      await showToast({
        style: Toast.Style.Failure,
        title: "Execution Failed",
        message: error.message
      });
    }
  };

  return (
    <List>
      <List.Item
        title="Generate Daily Report"
        subtitle="Creates today's report"
        actions={
          <ActionPanel>
            <Action title="Run" onAction={() => runPythonScript("daily_report.py")} />
          </ActionPanel>
        }
      />
    </List>
  );
}


실전 활용 예시: 자동화 스크립트 모음


자주 사용하는 파이썬 작업들을 Raycast 버튼으로 만들어보면 업무 효율이 크게 올라가요.


클립보드 데이터 처리기

# clipboard_processor.py
import subprocess
import json

def get_clipboard():
    return subprocess.check_output(['pbpaste']).decode('utf-8')

def process_json():
    try:
        data = get_clipboard()
        parsed = json.loads(data)
        formatted = json.dumps(parsed, indent=2, ensure_ascii=False)
        
        # 다시 클립보드에 복사
        process = subprocess.Popen(['pbcopy'], stdin=subprocess.PIPE)
        process.communicate(formatted.encode('utf-8'))
        
        print("✅ JSON 포맷팅 완료!")
    except json.JSONDecodeError:
        print("❌ 클립보드의 내용이 유효한 JSON이 아니에요")

if __name__ == "__main__":
    process_json()


CSV 파일 빠른 분석기

# quick_csv_analyzer.py
import pandas as pd
import sys
from pathlib import Path

def analyze_csv(filepath):
    try:
        df = pd.read_csv(filepath)
        
        print(f"📊 파일: {Path(filepath).name}")
        print(f"행 개수: {len(df):,}")
        print(f"열 개수: {len(df.columns)}")
        print(f"\n컬럼 목록:")
        for col in df.columns:
            print(f"  - {col} ({df[col].dtype})")
        
        print(f"\n결측치 정보:")
        missing = df.isnull().sum()
        for col, count in missing[missing > 0].items():
            print(f"  - {col}: {count}개")
            
    except Exception as e:
        print(f"❌ 오류 발생: {e}")

if __name__ == "__main__":
    if len(sys.argv) > 1:
        analyze_csv(sys.argv[1])
    else:
        print("사용법: python quick_csv_analyzer.py [파일경로]")

안정적인 스크립트 구조 만들기


파이썬 스크립트를 Raycast와 연동할 때는 에러 처리와 로깅이 중요해요. 기본 템플릿을 만들어두면 유용해요.


#!/usr/bin/env python3
import argparse
import logging
import sys
from pathlib import Path

# 로깅 설정
log_file = Path.home() / "raycast_scripts.log"
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler(log_file),
        logging.StreamHandler(sys.stdout)
    ]
)
logger = logging.getLogger(__name__)

def main(args):
    try:
        logger.info(f"스크립트 시작: {args}")
        
        # 여기에 실제 작업 코드
        result = process_task(args.input)
        
        print(f"✅ 작업 완료: {result}")
        logger.info(f"작업 성공: {result}")
        
    except Exception as e:
        error_msg = f"❌ 오류 발생: {str(e)}"
        print(error_msg)
        logger.error(error_msg, exc_info=True)
        sys.exit(1)

def process_task(input_data):
    # 실제 작업 로직
    return f"Processed: {input_data}"

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Raycast Python Script")
    parser.add_argument("--input", type=str, help="입력 데이터")
    args = parser.parse_args()
    
    main(args)


주의사항과 최적화 팁


맥에서 파이썬 스크립트를 자동화할 때 자주 마주치는 문제들이 있어요.


파이썬 경로 문제 해결


시스템 파이썬과 Homebrew로 설치한 파이썬이 섞이면 모듈 에러가 발생해요. Script Command에서는 절대 경로를 명시하는 게 안전해요.


#!/bin/bash
# 가상환경 활성화 후 실행
source ~/projects/myproject/venv/bin/activate
python ~/projects/myproject/script.py


환경 변수 처리


Raycast는 터미널과 다른 환경에서 실행되므로 . zshrc의 환경 변수를 못 읽을 수 있어요.


import os
import sys

# 필요한 경로 직접 추가
sys.path.insert(0, '/Users/username/my_modules')

# 환경 변수 설정
os.environ['API_KEY'] = 'your-api-key'


실행 시간 최적화


Raycast는 빠른 실행을 중시하므로 무거운 import는 필요할 때만 해요.


def process_data():
    # pandas가 필요한 경우에만 import
    import pandas as pd
    df = pd.read_csv('data.csv')
    return df.describe()


Script Command 방식은 설정이 간단해서 대부분의 경우 충분해요. 복잡한 UI가 필요하거나 여러 스크립트를 관리하고 싶다면 커스텀 확장 개발을 고려해보세요.


가장 중요한 건 자주 사용하는 작업을 찾아내고, 그것을 자동화하는 거예요. 하루에 5번씩 실행하던 명령어를 단축키 하나로 만들면 그 편리함은 직접 경험해봐야 알 수 있어요.


맥에서 파이썬 자동 실행 설정하기 - launchd 완벽 가이드