2011-12-22 4 views
6

sys.path가 확장 된 후에 만 ​​파이썬 인터프리터에서 "import some_module" 을 호출하여 zip 파일에서 파이썬 모듈 (.py, .pyc, .pyd)을로드 할 수 있습니다. 으로 .pyd 모듈이 필요합니다 내가 임베디드 파이썬에서 zip 파일을로드하십시오.

import zipextimporter 
zipextimporter.install() 

후자를

를 실행 한 만 후 zip 파일을 포함합니다.

C++에 포함 된 Python의 Python .py 및 .pyc 모듈을로드 할 수도 있습니다. 그러나 임베디드 파이썬에서 모듈을으로 .pyd로드하기 위해 나는 오류없이이 선을 넘어

PyRun_SimpleString("import zipextimporter"); 

는 C++ EXE 실행을 추가했습니다.

enter image description here

왜 zipextimporter.install() 충돌이 파이썬이 내장되어 않습니다하지만 다음 명령

PyRun_SimpleString("zipextimporter.install()"); 

날이 오류를 준다?

어떻게 해결할 수 있습니까?

아마 C++ 코드 이 컴파일되는 방식과 관련이 있습니까? 나는 g ++ 사용 : 그 해결책을 제공 할 수있는 링크 How to link against msvcr90.dll with mingw gcc?

을 보았다

g++ embed-simple.cpp -IE:\Python27\include -LE:\Python27\libs -lpython27 -o embed-simple

? 그렇다면 gcc -> g ++을 어떻게 조정해야합니까? C가 아니기 때문에 C++ 코드를 실행해야합니다.

WinXP에서 Python 2.7.2를 실행하고 있습니다.

Import Error: No module named....

이는 내장 C++ 스크립트가 컴파일되는 방식을가 문제가

:

난 그냥이, ​​파이썬 2.7.2 새로 설치 후 런타임 오류가 발생하지 않습니다? 나는 g ++를 사용했다. 나는 또한 인텔 컴파일러로 컴파일되었지만 동일한 런타임 오류가 발생했습니다. 아마도 MS Visual C++를 사용해보아야 할 것입니다.

또는 ctypes를 사용하여 pyd를 가져 오시겠습니까?

+0

나는 또한 이것에 비틀 거렸다. PyCrypto를 임포트하려고하는데 임베디드 버전을 사용할 때 같은 오류가 발생한다. 이걸 바래. – Chiguireitor

답변

4

PYD 파일은 이름이 변경된 확장명을 가진 기본 DLL 파일입니다. 로드는 운영 체제 기능 및 운영 체제 제한 사항에 달려 있습니다.

Windows XP 또는 내가 아는 한 모든 OS는 ZIP 파일에서 DLL 파일을로드 할 수 없으므로 ZIP 파일에서 PYD 파일을로드 할 수 없습니다.

+1

답변이 잘못되었습니다. 그것은 WinXP의 파이썬 인터프리터에서 작동하지만 WinXP의 임베디드 파이썬에서는 작동하지 않습니다. –

+0

흠. 나는 틀린 그때해야한다 :(그러나 저것은 아마 문제의 원인이다 ... DLL은 EXE와 동일한 전화 번호부에서 DLL 파일을 선적과 같은 어떤 OS 특정한 규칙을, 명예를 준다. 그들은 ZIP에서 결코 비난되지 않을지도 모르다, 그러나 그것은 다만 "어떤 이유로 든 작동합니다."대신 sys.path를 수정 해보십시오. os.environ [ "PATH"]을 수정하면 Windows에서 DLL을로드 할 수있는 힌트가 생깁니다. –

+0

아니요 확인했습니다. 파이썬 인터프리터에서만 작동합니다. zip을 포함하도록 sys.path를 조정 한 후 –

2

(zipextimporter 내부에있는) memimporter.pyd가 컴파일 된 Python 버전은 무엇입니까? 파이썬 인터프리터와 pyd가 일치하지 않으면 끔찍한 충돌이 발생합니다.

mem 수입 코드가 어디 있는지 모르겠지만 생각에 짐 가져 오기 후크를 삽입하여 우편 번호 기반 pyd 가져 오기를 감지하고 pyd를 임시 위치로 추출하고 전화를 걸라고 생각합니다. 파이썬 인터프리터는이를 표준으로 가져옵니다.

+0

나는 이것이 코드라고 생각한다. http://src.chromium.org/svn/trunk/tools/third_party/python_26/Lib/site-packages/zipextimporter.py 그러나 나는 어떤 파이썬 memimporter 버전을 컴파일했는지 확인하십시오. 어떻게 찾을 수 있습니까? –

+0

어디서 다운로드 했습니까? 보통 다운로드 링크에서 또는 그 근처에서 알려줍니다. 내가 지적한 링크에는 파이썬 2.6 경로가 있습니다. , 예를 들어 –

+0

하지만 하나는 "import _ memimporter "를 사용할 수 있습니다. 그러나 zipextimporter.pyc를 zip 내부에서 가져올 수 있습니다.이 경우 zipextimporter.pyc는 필자의 경우 py2exe에 의해 생성되었습니다. 필자는 sys.path를 조정하여 파이핑을 시작 부분 대신 끝에 넣으려고 시도했다. 즉, PyRun_SimpleString ("sys.path.insert (-1, \". \\ python27.zip \ ")"); PyRun_SimpleString ("sys.path.insert (0, \". \\ python27.zip \ ")") 대신; 그러나 그것은 차이를 만들지 않았습니다. –

5

memimporter와 zipextimporter는 실제로 파일을 압축 해제하지 않고 메모리/zip 아카이브에서 .pyd 파일을로드 할 수 있습니다.

runtimerror R6034는 VC9 런타임 라이브러리가 매니페스트를 통해로드되어야한다는 사실 때문에 발생합니다. 다른 C 런타임을 사용하는 Python 2.5에서 코드를 실행하면 대부분 성공할 수 있습니다. VC9 런타임 라이브러리를 참조하는 매니페스트를 EXE 파일에 임베드해야합니다. 어쩌면 py2exe 위키가 지침을 제공 할 수 있습니다.

+0

감사합니다. 이것은 Visual Studio로 임베딩 C++ 코드를 컴파일하면 Visual Studio가 기본적으로 매니페스트를 임베드하려고하기 때문에 아마도 작동 할 것입니까? –

+0

모르겠다. (나는 C/C++ 프로그램을 더 이상 쓰지 않는다 ;-) – theller

+0

나는 아직도 혼란 스럽다. zipextimporter.pyc가 zip 안에 있으면 _memimporter도 zip 안에 있습니다. 그러나 후자는 우리가로드 할 수없는 .pyd 파일입니다. 그 이유는 zip에서 pyd 파일을로드하는 것뿐입니다. –

2

py2exe를 사용하여 응용 프로그램을 컴파일하려고했던 것과 같은 종류의 문제인 것 같습니다. 여기를보십시오 : http://www.py2exe.org/index.cgi/Tutorial, 섹션 5.2를보십시오. 똑같은 일이 생깁니다 ... 처음으로 memimporter를 사용하려고하면 비슷한 오류 메시지와 함께 충돌합니다. 기본적으로, Python 2.6+에서는 경로에 런타임 라이브러리의 정확한 버전과이를 가리키는 목록이 있어야합니다. 당신이 임베디드 파이썬을 사용하고 있기 때문에, 어떻게 작동하는지 모르겠지만, 아마도 당신을 가까이하게 할 것입니다.

나는 런타임 DLL의 어딘가에 '올바른'버전을두고 zipextimporter를 가져 오기 전에 파이썬 코드에서 올바른 런타임 경로를 sys.path에 추가하고 수정하는지 확인합니다. 임베디드 파이썬에 대한 매니페스트를 얻는 방법을 모르겠다. 상위 앱의 매니페스트에 포함되어야 할 수도 있습니다.

편집 : BTW, 잊어 버렸습니다.이 문제를 둘러싼 또 다른 방법을 발견했습니다. 정확한 세부 정보를 잊어 버렸지 만, 앱이 기본 버전의 런타임을로드 한 다음 Python이 해당 버전을 묻고 c : \ python {26,27}에서 하나를 찾으면 일치하지 않습니다. 이 문제를 해결하는 가장 간단한 방법은 c : \ python \ msvcr90.dll을 삭제하는 것입니다. 그럼, 파이썬은 귀하의 응용 프로그램의 매니 페스트와 작동하지 않을 수도 dll의 로컬 (옛) 버전을 공격하지 않을 것이며, 둘 다 나가서 Windows 디렉토리에서 현재 버전을 얻을 것이다 일치합니다.

관련 문제