비 유니코드 퍼포스
퍼포스 서버는 유니코드/비 유니코드 모드로 설정해서 서비스 할 수 있다.
처음 설치하면 기본적으로 비 유니코드 모드인데 한참 운영한 뒤에 유니코드 모드로 변경하는 것은 쉽지 않다.
Set up a server for Unicode | P4 Server Administration Documentation (2025.1)
따라서 한국어와 같이 영어 이외의 문자를 사용하는 경우 ,
처음 세팅하는 퍼포스는 왠만하면 유니코드 모드로 설정하는 것이 마음 편하다.
p4python
퍼포스에는 GUI 환경인 p4v와 커맨드 라인 환경인 p4 이외에도
C/C++, C#, python과 같이 다양한 언어에서 퍼포스 기능을 사용할 수 있도록 API를 지원한다.
그 중에서 p4python은 파이썬의 API로 C++ API를 파이썬으로 래핑하여 제공된다.
Home | P4 API for Python Documentation (2025.1)
이 API를 사용하면 아래와 같이 python에서 p4 기능을 사용할 수 있다.
from P4 import P4, P4Exception
p4 = P4()
p4.port = "127.0.0.1:1666"
p4.user = "HAPPY"
p4.client = "HAPPY_test"
try:
p4.connect()
result = p4.run("fstat", "//...")
print(result)
p4.disconnect()
except P4Exception:
for e in p4.errors:
print(e)
문제가 된 설정
서버
OS: Windows Server
Locale: ko; 한국어 (Unicode UTF-8 지원 비활성화)
비 유니코드 모드
클라이언트
OS: Windows 10
Locale: ko; 한국어 (Unicode UTF-8 지원 비활성화)
인코딩 문제
비 유니코드 서버에 한글 경로가 들어간 파일을 올리고 p4python으로 이를 처리할 경우 결과 인코딩이 깨지거나 명령이 실패하게 된다.
이럴 때는 아래와 같이 인코딩을 지정해서 해결할 수 있다.
p4 = P4()
p4.port = "127.0.0.1:1666"
p4.user = "HAPPY"
p4.client = "HAPPY_test"
p4.encoding = 'cp949' # 인코딩 지정
공식 문서에는 아래와 같이 비 유니코드 서버에서 문자열을 받을 인코딩을 지정하라고 짤막하게만 설명되어있다.
Encoding to use when receiving strings from a non-Unicode server. If unset, use UTF8.
Can be set to a legal Python encoding, or to `raw` to receive Python bytes instead of Unicode strings. Requires Python 3.
추가적인 문제
기록을 해두지 않아 정확한 사례를 다시 찾지 못했으나,
encoding을 지정해서 사용해도 명령이 실패하는 케이스가 있었다.
커맨드 라인 명령어인 p4에서는 문제가 되지 않았기에 p4 명령 실행을 래핑해서 사용하는 방식도 병행했다.
p4의 출력 포맷팅 옵션(-Ztag) 등을 사용하면 출력을 파싱하는게 조금 덜 귀찮아진다.
Formatting P4 command output using the -F global option with examples