2011-04-21 6 views
1

나는 임베디드 파이썬 2.6 인터프리터가 포함 된 프로그램을 가지고있다. 내가 통역을 호출 할 때,이 같은 ... PySys_SetPath은() 내 파이썬 스크립트 파일을 포함 내 실행 파일 옆에 설치된 서브 디렉토리에 인터프리터의 수입 경로를 설정하기 위해 호출파이썬에 콜론이 포함 된 경로를 사용하는 방법은 무엇입니까?

PySys_SetPath("/path/to/my/program/scripts/type1:/path/to/my/program/scripts/type2"); 

을 (경로 것을 제외 문자열은 위의 예제 에서처럼 하드 코딩되지 않은 내 프로그램의 실행 파일의 현재 위치를 기반으로 동적으로 생성됩니다.)

영리한 사용자가 내 프로그램을 설치할 폴더 아래에 그 이름의 콜론. 때문에 지금은 파이썬을

PySys_SetPath("/path:to/my/program/scripts/type1:/path:to/my/program/scripts/type2"); 

... 이것은 내 모든 파이썬 스크립트를 나누기 :이 경우, 내 PySys_SetPath() 명령 ("경로"라는 이름의 폴더의 존재를주의)이처럼 보이는 끝 "/ path : to/myprogram/scripts/type1"대신에 "/ path"와 "to/my/program/scripts/type1"에서 스크립트 파일을 찾으며 import 문도 작동하지 않습니다.

제 질문은 폴더 이름에 콜론을 사용하지 않도록 사용자에게 알려주는 것 외에 다른 문제가 있습니까?

Python/sysmodule.c의 makepathobject() 함수를 살펴 보았지만 리터럴 콜론을 처리하기 위해 어떤 종류의 인용이나 이스케이프도 지원하지 않는 것 같습니다.하지만 어쩌면 약간의 뉘앙스가 누락되었습니다.

+1

콜론을 백 슬래시로 이스케이프 해 보셨습니까? 그래서'PySys_SetPath (r "/ path \ : ~/my/program/scripts/type1 :/path \ : ~/my/program/scripts/type2");'와 같은 것입니다. –

답변

6

실행중인 문제는 PySys_SetPath 함수가 전달하는 문자열을 구분 기호로 콜론을 사용하여 구문 분석하는 것입니다. 이 구문 분석기는 각 문자가 경로를 구분하는 데 사용되는 문자 인 :을보고 있으며이 문자를 이스케이프 처리 할 수는 없습니다.

그러나, 당신은 (콜론을 포함 할 수 있습니다 각각) 개별 경로의 목록을 작성하여이를 무시하고 sys.path 설정 PySys_SetObject를 사용할 수 있습니다

PyListObject *path; 

path = (PyListObject *)PyList_New(0); 
PyList_Append((PyObject *) path, PyString_FromString("foo:bar")); 
PySys_SetObject("path", (PyObject *)path); 

이제 인터프리터는 별개로 "foo:bar"를 볼 수 있습니다 sys.path의 구성 요소입니다.

+0

매력처럼 작동합니다. 감사합니다. ^) –

+0

정말 기쁩니다! – samplebias

2

파일 경로의 콜론을 지원하면 여러 운영 체제에서 많은 수의 웜을 열 수 있습니다. 예를 들어, Windows 또는 Mac OS X에서는 유효한 경로 문자가 아니며, 정확하게이 이유 때문에 스크립팅 환경의 컨텍스트에서 지원하는 것이 특히 합리적이지는 않습니다. 나는 리눅스가 콜론 파일 이름도 허용한다는 사실에 조금 놀랐다. 특히 :는 매우 일반적인 경로 분리 문자이다.

콜론을 이스케이프 처리하여/path :/to/path \ :를 /로 변환하여 작동하는지 확인해보십시오. 그 외에 파일 이름에 콜론을 사용하지 않도록 사용자에게 알려주십시오. 그들은 여러 가지 다른 환경에서 모든 종류의 문제에 부딪 힐 것이고 단지 나쁜 생각입니다.

관련 문제