2014-01-06 1 views
7

표준 라이브러리없이 파이썬을 임베드 할 수 있습니까?파이썬을 표준 라이브러리없이 임베드 할 수 있습니까?

나는 cmake build for python 2.7.6 함께 일하고 있어요 그리고 난과 같이 실행 기본 내장 된 스크립트있어 :

#include <stdio.h> 
#include <Python.h> 

int main(int argc, char *argv[]) { 

    /* Setup */ 
    Py_SetProgramName(argv[0]); 
    Py_Initialize(); 

    /* Run the 'main' module */ 
    int rtn = Py_Main(argc, _argv); 
    Py_Finalize(); 

    return rtn; 
} 

를 ..하지만 내가 그것을 실행할 때, 내가 얻을 :

ImportError: No module named site 

올바른 $ PYTHONHOME을 설정하면 제대로 작동합니다. 하지만 그건 내가하려는 일이 아니야. 파이썬 복사본을 표준 라이브러리없이 독립 실행 형 응용 프로그램에 포함하려고합니다.

이 사용법을 고맙게 생각합니다. 그러나이 특정 임베디드 환경에서는 부모 응용 프로그램에 의해 노출 된 특정 라이브러리 만 사용할 수있는 루아 (Python 구문이 분명합니다)와 같은 것을 원합니다.

표준 라이브러리를 크로스 링크 된 동적 라이브러리와 함께 배포 (또는 빌드)하지 않으므로 보너스가 추가되었습니다.

이 모든 기능을 사용할 수 있습니까? 아니면 필연적으로 표준 라이브러리의 일부인 sys.path, import, {}, [] 등과 같은 언어의 기본 블록을 찾지 못하게 될까요?

가능하다면 어떻게 할 것입니까?

+2

왜 자신의 최소한의 '표준 라이브러리'를 제공하지? 'site.py' 만 포함하고, 'site.py'는 실행해야하며, 애플리케이션에 필요한 것은 무엇입니까? –

+2

그러나 그렇습니다. CPython 구현에서는 특정 모듈이 존재하고 가져올 수 있어야합니다. Python 3에는 가져 오기 기능이 포함되어 있습니다. 'sys'는 빌트인 (built-in) 모듈입니다. 구문은 결코 가져 오지 않지만 언어의 일부이므로'{}'와'[] '는 깨지지 않을 것입니다. –

+0

나는 이것에 대해 생각하고 있었지만, 하나의 바이너리와 함께 보내려면 약간 짜증이났다.py 파일; kivy가 kivy-ios 프로젝트에 대해 가져 오는 메커니즘을 해킹했을 가능성이 가장 낮고 필요한 최소 모듈을 포함 시키면 원시 텍스트 모양이 될 수 있다고 생각했지만 그 경로를 따라가는 방법을 정확히 모르겠습니다 ~ – Doug

답변

11

간단한 대답은 가능합니다.

int main(int argc, char *argv[]) { 

    /* Setup */ 
    Py_NoSiteFlag = 1; // <--- This 
    Py_SetProgramName(argv[0]); 
    Py_Initialize(); 

    /* Run the 'main' module */ 
    int rtn = Py_Main(argc, argv); 
    Py_Finalize(); 

    return rtn; 
} 

지금까지 내가, 아무것도 휴식을 말할 수있는 당신은 완벽하게 정상적으로 (모듈 ~를 가져올 수있는 기능을 포함하여) 모든 것을 계속 사용할 수있다. 당신이 번들로 제공되지 않는 표준 라이브러리에서 아무것도를 가져 오려고하면 얻을 것이다 :

>>> import os; 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named os 

내가 관심있는 사람을 위해 여기까지 코드의 복사본을 떠날거야;

https://github.com/shadowmint/cmake-python-embed-nostdlib

+1

'site.py'를 가져 오는 것은 인터프리터를 수정하지 않고서는 피할 수 있어야한다고 생각합니다. 기본 실행 파일은'-S' 플래그가 주어지면이를 피할 수 있습니다. 관련 플래그 ('Py_NoSiteFlag')가 내부인지 개인인지 확인해야 할 것입니다. 또는 임베디드 빌드에 더미'site' 모듈을 추가하십시오. 두 가지 옵션 모두 너무 간단하고 깨지기 쉬운 경우에도 별도의 패치를 유지하는 것보다 낫습니다. – delnan

+0

@delnan 당신은 완전 맞습니다! 감사! Py_NoSiteFlag를 사용하여 답변을 업데이트했습니다. 더 나은 해결책입니다. – Doug

+1

이것은 파이썬 3에서는 충분하지 않은 것 같습니다 : http://stackoverflow.com/questions/34724057/embed-python3-without-standard-library –

1

AFAIK, 할 수 없습니다. 표준 라이브러리가 없으면 Python은 os.py (2.x에서 3.x; string.py에서)를 찾으므로 시작하지 않습니다. 시작할 때 많은 모듈, 특히 site.py를 가져옵니다. 적어도 pythonxy.dll과 아마도 lib 폴더의 내용과 확장 모듈, 즉 DLLs 폴더의 내용이 필요합니다.

표준 라이브러리의 압축 복사본이어야하는 pythonXX.zip 파일 (XX는 27 또는 33과 같은 버전 번호 임)로 파일을 보낼 수 있습니다. 필요없는 물건에서 도서관을 자유롭게 지울 수 있습니다. 종속성을 정적으로 계산하는 다양한 도구가 있습니다 (modulefinder 참조).

Lua가 임베디드 스크립팅 언어로 더 많이 사용되는 이유입니다.