FAQ
자주 묻는 질문
앱 시작 및 복구, 코드 편집과 실행, 라이브러리 및 확장 기능, 파일 전송, AI 모델과 어시스턴트, 구매 및 복원에 관한 안내입니다.
앱 시작 및 복구
Pythona를 열자마자 앱이 종료되면 어떻게 하나요?
안전 실행을 시도해 보세요. 홈 화면에서 Pythona 아이콘을 길게 누르고 ‘안전 실행’을 선택하세요.
앱 시작 시 발생하는 비정상 종료는 이전에 열었던 파일이나 폴더를 복원하는 과정과 관련이 있을 수 있습니다. 안전 실행은 이전에 열었던 탭과 폴더 기록을 초기화하고 빈 편집기와 기기의 Documents 폴더에서 시작합니다. 스크립트 파일은 유지됩니다.
앱이 열리면 이전에 사용하던 폴더와 파일을 하나씩 열어 특정 파일이나 위치에서 문제가 발생하는지 확인하세요. 파일을 열 때 다시 종료되고 ‘의미 기반 강조 표시’가 켜져 있다면, 다시 안전 실행을 한 뒤 ‘설정 → 테마’에서 ‘의미 기반 강조 표시’를 끄고 재시도하세요.
앱 업데이트 후 예제 스크립트가 실행되지 않으면 어떻게 하나요?
앱을 업데이트해도 저장된 예제 스크립트는 자동으로 교체되지 않습니다. 업데이트 후 예제가 실행되지 않으면 현재 앱 버전에 포함된 예제를 복원한 뒤 다시 실행해 보세요.
수정한 예제를 먼저 백업한 다음, “설정 → 예제 스크립트 복원”을 선택하세요. examples 폴더에서 이름이 같은 예제 파일을 덮어씁니다.
예제를 복원해도 설치된 Python 패키지는 초기화되지 않습니다. 의존성 버전 충돌이 계속되면 오류 메시지에 나온 패키지의 설치 버전을 확인하세요.
의존성 충돌 안내 보기편집과 실행
코드를 입력할 때 앱이 종료되면 어떻게 하나요?
편집기에서 코드를 입력할 때 앱이 반복해서 종료된다면 코드 완성과 관련이 있을 수 있습니다. ‘설정 → 코드 완성’에서 ‘제안 자동 표시’를 끄고 같은 파일에서 다시 입력해 여전히 종료되는지 확인하세요.
문제를 제보할 때는 문제를 일으키는 코드 조각, 구체적인 입력 순서, ‘제안 자동 표시’를 꺼도 앱이 종료되는지를 함께 알려 주세요.
중지를 눌러도 바로 멈추지 않는 이유는 무엇인가요?
중지 버튼은 현재 실행에 중단을 요청하지만 모든 작업을 즉시 중단할 수는 없습니다. time.sleep(), 네트워크 응답이나 잠금 대기, 일부 네이티브 라이브러리 연산은 해당 작업이 반환된 후에 중지됩니다. 모듈을 가져오는 중이라면 가져오기가 끝날 때까지 기다립니다.
오래 기다려도 중지되지 않으면 파일을 저장한 뒤 iOS 앱 전환기에서 Pythona를 종료하고 다시 열어 주세요.
스크립트를 실행하다가 앱이 종료되는 이유는 무엇인가요?
종료 함수
스크립트가 quit(), exit(), sys.exit()를 호출해 실행을 끝내면 기본 설정에서는 Pythona 앱 전체가 종료됩니다.
‘설정 → quit() / exit()’에서 ‘Pythona 종료’를 ‘현재 실행만 종료’로 바꾸면 앱을 열어 둔 채 현재 실행만 끝낼 수 있습니다.
메모리 부족
큰 배열을 처리하거나 큰 모델을 실행할 때 메모리 사용량이 너무 많아지면 iOS가 앱을 직접 종료할 수 있습니다. 이때 Python 오류가 표시되지 않을 수도 있습니다. 이런 종료는 ‘quit() / exit()’ 설정으로 제어할 수 없습니다. 데이터나 모델의 크기를 줄이거나 데이터를 나누어 처리해 보세요.
UIKit 스레드
Pythona의 Python 스크립트는 기본적으로 백그라운드 스레드에서 실행됩니다. ctypes나 rubicon-objc로 UIKit을 호출할 때 인터페이스를 만들거나 업데이트하는 작업은 iOS 메인 스레드(UI 스레드)에서 실행해야 합니다. 그렇지 않으면 앱이 비정상 종료될 수 있습니다.
이런 작업을 함수로 묶어 내장 함수 run_on_ui(...)로 메인 스레드에 비동기로 전달하거나, GCD를 사용해 직접 메인 큐로 보낼 수 있습니다. 앱 내 WKWebView 예제에서 run_on_ui 사용법을 확인할 수 있습니다.
문제가 반복되면 재현할 수 있는 코드와 실행 단계를 함께 보내 주세요.
입력을 끝내고 EOF를 보내려면 어떻게 하나요?
스크립트 실행 중 콘솔 입력란의 편집 메뉴에서 “EOF 보내기”를 선택하거나 외장 키보드에서 Ctrl+D를 누르세요. 입력란의 텍스트가 먼저 전송된 뒤 현재 실행의 입력이 종료됩니다.
스크립트에 인수를 전달하려면 어떻게 하나요?
편집기의 실행 버튼을 길게 누르고 ‘인수를 사용하여 실행…’을 선택하세요. 인수는 스크립트의 sys.argv[1:]로 전달됩니다. 자주 사용하는 인수는 같은 메뉴의 ‘실행 구성 편집…’에서 저장하고 기본 구성으로 설정할 수 있습니다.
단축어 앱에서 스크립트를 실행하려면 어떻게 하나요?
편집기 상단의 파일 이름을 탭하고 ‘단축어’를 선택한 다음 ‘스크립트 경로’를 복사하세요. 단축어 앱에서 Pythona의 ‘Python 스크립트 실행’ 동작을 추가하고 경로를 입력하세요. 필요하면 인수를 추가할 수 있으며, 동작이 반환한 텍스트 출력을 후속 동작에 전달할 수도 있습니다.
홈 화면에서 한 번의 탭으로 스크립트를 실행하려면 어떻게 하나요?
Pythona에서 스크립트를 열고, 편집기 상단의 파일 이름을 탭한 다음 ‘단축어’를 선택하고 ‘URL’을 복사하세요.
시스템 단축어 앱에서 새 단축어를 만들고 ‘URL 열기’ 동작을 추가한 다음 복사한 URL을 입력하세요.
해당 단축어의 ‘세부사항’에서 ‘홈 화면에 추가’를 선택하고, 이름과 아이콘을 설정한 다음 ‘추가’를 탭하세요.
이후 홈 화면의 아이콘을 탭하면 Pythona가 열리고 해당 스크립트가 실행됩니다.
Apple의 홈 화면 추가 안내 보기라이브러리 및 확장 기능
일부 서드 파티 라이브러리가 설치되지 않는 이유는 무엇인가요?
패키지 관리자는 순수 Python wheel로 배포되는 서드 파티 라이브러리의 설치를 지원합니다. 소스 코드만 제공하거나 C, C++, Rust 등의 컴파일된 확장 모듈이 필요한 라이브러리는 컴퓨터에서처럼 바로 설치할 수 없습니다. NumPy, SciPy 등의 네이티브 라이브러리는 미리 컴파일된 상태로 앱에 포함되어 있습니다.
순수 Python 라이브러리도 Python 3.14 및 iOS와 호환되어야 합니다. 현재 환경에서 지원하지 않는 시스템 기능에 의존하면 실행되지 않을 수 있습니다.
주요 내장 라이브러리 보기패키지를 설치하면 의존 패키지 버전이 바뀌거나 충돌이 보고되는 이유는 무엇인가요?
모든 프로젝트는 현재 기기의 사용자 패키지 환경을 공유합니다. 요구 사항을 충족하는 기존 의존 패키지는 그대로 사용하며, 충족하지 않으면 사용자가 설치한 순수 Python 의존 패키지를 업그레이드하거나 다운그레이드할 수 있습니다. 앱 내장 패키지는 자동으로 교체하지 않습니다.
버전을 변경하기 전에 다른 설치된 패키지가 선언한 관련 의존성을 확인합니다. 충돌이나 처리할 수 없는 요구 사항이 있으면 이유를 알리고 중단합니다. 모든 버전 조합을 시도하거나 모든 호환성 문제를 찾아내지는 못합니다.
호환되는 버전을 지정하거나 더 이상 필요하지 않은 충돌 패키지를 제거한 뒤 다시 시도할 수 있습니다. Python 스크립트를 직접 작성하여 순수 Python 패키지를 다운로드하고 배치하며 의존성을 관리할 수도 있습니다. pythona.packages.install() 호출에도 위 규칙이 적용되며, 수동 설치 역시 Python과 iOS의 호환성 제한을 받습니다. 이미 가져온 패키지를 교체한 뒤에는 Pythona를 다시 시작하세요.
설치한 라이브러리도 iCloud로 동기화되나요?
아니요. 패키지 관리자로 설치한 라이브러리는 현재 기기의 로컬 폴더에 저장되며, 로컬 저장소, iCloud, 외부 폴더의 스크립트가 함께 사용합니다.
iCloud로 프로젝트를 동기화한 뒤에도 다른 기기에서 프로젝트에 필요한 라이브러리를 별도로 설치해야 합니다.
Pythona에는 어떤 iOS 기능 라이브러리가 있나요? 어떻게 사용하나요?
Pythona에는 cocoa-py가 내장되어 있습니다. scene은 게임, 애니메이션, 대화형 그래픽에 사용할 수 있습니다. photos로 시스템 사진 선택기에서 사진과 동영상을 선택하거나 사진 보관함에 저장할 수 있습니다. audio는 오디오 재생, 녹음, 효과 처리를 제공하며, coreml은 Core ML 모델을 불러와 기기에서 추론을 실행합니다.
pythona로 앱 자체의 기능을 이용할 수 있습니다. pythona.packages로 서드 파티 패키지를 설치하고, pythona.ai로 사용자 지정 AI 공급자 설정을 생성, 조회, 업데이트할 수 있습니다.
더 많은 iOS 시스템 기능이 필요하다면 rubicon-objc로 Python에서 iOS 네이티브 API를 호출하는 방법을 권장합니다. UIKit으로 네이티브 인터페이스를 만들 수도 있습니다. 앱 내 기기 정보 및 WKWebView 예제를 참고하세요.
cocoa-py는 오픈 소스이며 macOS도 지원합니다. 사용 가능한 기능은 플랫폼마다 다릅니다. 소스 코드와 API 문서는 GitHub에서 확인할 수 있으며, Issue와 Pull Request를 환영합니다.
cocoa-py 소스 코드 및 문서 보기게임이나 그래픽 인터페이스를 만들려면 무엇을 사용하면 좋나요?
2D 게임, 애니메이션, 오디오 재생에는 pygame을 권장합니다(앱에는 pygame-ce가 내장되어 있습니다). pygame.mixer만 사용하면 창을 만들지 않고 음악이나 효과음을 재생할 수 있습니다.
인터페이스나 웹 게임은 HTML, CSS, JavaScript로 만들고 Pythona에서 WKWebView로 표시할 수 있습니다. 웹 콘텐츠는 여러 플랫폼에서 재사용하기 쉽지만, WKWebView를 표시하는 코드와 웹 페이지를 Python 또는 iOS 기능에 연결하는 부분은 대상 환경에 맞게 수정해야 합니다.
iOS 네이티브 인터페이스가 필요하다면 rubicon-objc를 통해 UIKit을 호출할 수 있습니다. UIKit을 사용하는 코드는 여전히 iOS에 의존합니다.
Pythona는 Tkinter도 지원하므로 기존 Tkinter 스크립트를 실행하거나 간단한 도구를 만드는 데 사용할 수 있습니다. 인터페이스는 전통적인 데스크톱 스타일입니다. 모바일 기기에서의 디자인과 사용성을 더 중시한다면 웹 인터페이스나 rubicon-objc를 통한 UIKit 사용을 권장합니다. 앱 내에 관련 예제가 있습니다.
파일
컴퓨터와 파일을 주고받으려면 어떻게 하나요?
코드 프로젝트에는 Git을 권장합니다. Pythona와 컴퓨터에서 같은 원격 저장소를 복제하고, 변경 사항을 커밋한 뒤 푸시하고, 다른 쪽에서 풀하여 업데이트를 가져오면 됩니다.
iCloud Drive로 파일을 동기화하거나 시스템 공유 기능으로 내보낼 수도 있습니다. Mac과 파일을 주고받을 때는 AirDrop도 사용할 수 있습니다.
앱에서 ‘파일 서버’를 켜면 같은 로컬 네트워크에 연결된 컴퓨터의 브라우저에서 앱에 표시된 주소로 접속해 파일을 업로드하거나 다운로드할 수 있습니다. 파일 서버에는 로그인 암호가 없습니다. 신뢰할 수 있는 네트워크에서 사용하고 전송이 끝나면 서버를 중지해 주세요.
AI
Python에서 어떤 로컬 AI 모델을 사용할 수 있나요?
MLX: 앱에 내장된 MLX를 mlx-lm과 함께 사용해 호환되는 언어 모델을 실행할 수 있습니다. 앱의 examples/llm_demo.py를 참고하세요. 처음 실행하면 인터넷을 통해 종속 패키지를 설치하고 Hugging Face에서 모델을 다운로드합니다. MLX를 지원하고 메모리가 충분한 기기가 필요하며, 실행 속도와 사용 가능한 모델 크기는 기기 성능과 메모리에 따라 달라집니다.
Apple Foundation Models: 내장된 apple-fm-sdk로 Apple의 온디바이스 모델을 호출할 수 있습니다. Python에서 import apple_fm_sdk로 가져오세요. iOS / iPadOS 26 이상, Apple Intelligence를 지원하고 활성화한 기기, 사용할 준비가 된 시스템 모델이 필요합니다. 사용 가능 여부는 언어와 지역에 따라서도 달라집니다. API 사용법은 아래 문서를 참고하세요.
두 방식 모두 모델 추론은 기기에서 이루어집니다. 종속 패키지와 모델을 다운로드하려면 인터넷 연결이 필요하며, 스크립트나 어시스턴트 도구가 온라인 서비스를 사용할 때도 네트워크에 접속합니다.
Foundation Models Python SDK 사용법 보기로컬 모델을 AI 어시스턴트에 연결하려면 어떻게 하나요?
오픈 소스 프로젝트 Pythona AI Setup으로 Apple Foundation Models 또는 MLX 로컬 모델의 AI 어시스턴트 구성을 만들 수 있습니다.
Pythona에서 프로젝트를 복제하고 프로젝트 루트의 main.py를 실행하세요. 화면 안내에 따라 모델과 도구를 선택하고 구성을 추가한 다음, AI 어시스턴트 설정에서 해당 연결을 선택하세요. 자세한 단계는 프로젝트 README를 참고하세요.
파일 읽기 및 쓰기나 Python 실행 같은 어시스턴트 도구를 사용하려면 MLX 모델이 도구 호출을 지원해야 합니다. 도구 호출을 지원하지 않는 모델도 모든 도구를 비활성화하면 대화에 사용할 수 있습니다.
Pythona AI Setup 프로젝트와 사용법 보기AI 어시스턴트는 어떤 파일을 읽고 쓸 수 있나요?
AI 어시스턴트는 현재 대화의 작업 공간을 기본 프로젝트 디렉터리로 사용합니다. 새 대화에서 첫 메시지를 보내기 전에 ‘작업 공간 변경’에서 폴더를 선택할 수 있습니다. 파일 브라우저에서 다른 디렉터리로 이동해도 기존 대화의 작업 공간은 바뀌지 않습니다.
AI 어시스턴트는 run_python을 호출해 Python 코드를 실행하고 작업 공간 밖의 내용을 포함한 앱 내 파일과 폴더를 읽을 수도 있습니다. 이러한 접근은 선택한 작업 공간의 범위로 제한되지 않습니다.
AI 어시스턴트는 AGENTS.md를 지원하나요?
네. 현재 대화의 작업 공간 루트 디렉터리에 AGENTS.md를 만들고 프로젝트 설명, 코드 스타일, 기타 협업 규칙을 작성할 수 있습니다.
어시스턴트는 새 메시지를 처리할 때마다 이 파일을 자동으로 읽습니다. 수정 내용을 저장하면 다음 메시지를 보낼 때 적용됩니다. 작업 공간 루트의 AGENTS.md만 자동으로 불러오며, 하위 디렉터리에 있는 같은 이름의 파일은 자동으로 병합하지 않습니다.
사용자 지정 공급자(JS Provider)는 어떤 용도로 쓰나요?
사용자 지정 공급자를 사용하면 JavaScript로 AI 서비스 연결 방식을 직접 정의할 수 있습니다. 내장 공급자가 아직 지원하지 않는 API, 인증 방식, 서비스 기능을 이용하거나 사용자 지정 도구를 추가할 수 있습니다.
여기서 JavaScript를 사용하는 이유는 AI 서비스 연결, 인증, 응답 처리를 별도의 실행 환경에서 수행하여 이러한 연동 로직이 사용자의 Python 환경에 영향을 주지 않도록 하기 위해서입니다.
사용자 지정 도구로 외부 서비스를 호출할 수 있습니다. run_python을 이용하는 도구를 만들어 어시스턴트가 Python 스크립트를 실행하고, 스크립트를 통해 iOS 기능을 호출하게 할 수도 있습니다.
내장 공급자가 요구 사항을 충족한다면 추가 설정은 필요하지 않습니다. 기능을 확장하려면 설정 화면의 JavaScript API와 예제를 참고하세요.
구매 및 복원
다른 기기에서도 Pro를 다시 구매해야 하나요?
아니요. 다른 기기의 App Store에서 구매할 때 사용한 것과 동일한 Apple 계정으로 로그인하면 이미 구매한 Pro를 계속 사용할 수 있습니다.
새 기기에 Pythona를 설치하거나 재설치한 후에도 체험 안내나 구매 화면이 표시된다면 구매 상태가 아직 동기화되지 않았을 수 있습니다. 인터넷에 연결한 다음 구매 화면에서 “구매 복원”을 탭하세요.
구매 복원에는 요금이 부과되지 않습니다. 구매 버튼을 다시 탭하더라도 동일한 Apple 계정으로 이미 보유한 동일한 Pro 항목에 대해 중복으로 요금이 청구되지 않습니다.
Apple 계정을 전환한 후 Pro를 사용할 수 없는 이유는 무엇인가요?
Pro 구매는 구매 당시 App Store에서 사용한 Apple 계정에 연결됩니다. Pro를 구매하지 않은 다른 계정으로 전환하면 Pro를 사용하지 못할 수 있습니다. App Store에서 구매 당시 사용한 계정으로 다시 로그인한 다음 Pythona에서 “구매 복원”을 탭하세요.
App Store 계정을 자주 전환해 Pythona 사용에 불편을 겪고 있다면 문의해 주세요.