program tip

Py_Initialize 실패-파일 시스템 코덱을로드 할 수 없음

radiobox 2020. 12. 1. 07:52
반응형

Py_Initialize 실패-파일 시스템 코덱을로드 할 수 없음


파이썬 3.2를 사용하는 간단한 C ++ 테스트 프로젝트를 구성하려고합니다. 프로젝트는 잘 빌드되지만 Py_Initialize는 치명적인 오류를 발생시킵니다.

Fatal Python error: Py_Initialize: unable to load the file system codec
LookupError: no codec search functions registered: can't find encoding

최소 코드 :

#include <Python.h>

int main (int, char**)
{
  Py_Initialize ();
  Py_Finalize ();
  return 0;
}

OS는 32 비트 Vista입니다.

사용 된 python 버전은 VC ++ 10을 사용하여 소스에서 빌드 된 python 3.2 디버그 빌드입니다.

동일한 빌드의 python_d.exe 파일이 문제없이 실행됩니다.

누군가가 문제를 설명하고 해결 방법을 설명 할 수 있습니까? 내 Google-fu가 실패합니다.

편집 1

파이썬 소스 코드를 살펴본 후 오류가 말했듯이 코덱 검색 기능이 등록되지 않았 음을 발견했습니다. 둘 다 codec_registerPyCodec_Register있어야합니다. 코드의 어느 곳에도 이러한 함수가 호출되지 않습니다.

이 함수가 언제 어디서 호출되어야하는지 아직 알지 못하기 때문에 이것이 무엇을 의미하는지 실제로 알지 못합니다. 오류를 발생시키는 코드는 다른 Python 빌드 (3.1.3)의 소스에서 완전히 누락되었습니다.

2 편집

아래 내 질문에 답했습니다.


체크 PYTHONPATHPYTHONHOME환경 변수를하고 파이썬 2.x를 가리 키지 않습니다 확인

http://bugs.python.org/issue11288


이 부분은 앞서 언급되었지만, 간단히 말해서 이것은 내가 파이썬 설치하고 내 글로벌 OS 환경 셋업 포인트에 여러가 내 환경 일 것입니다 다른이 나는가 발생할 때 함께 작동하도록 시도하는 것보다 설치 문제.

(로컬 또는 글로벌) 환경이 작업하려는 설치를 가리 키도록 완전히 설정 되었는지 확인하십시오 . 예를 들어 python27 및 python33을 두 개 (또는 그 이상) 설치했다고 가정 해 보겠습니다 (죄송합니다. 다음은 동등한 UNIX 스타일 경로에도 유효해야합니다. 여기에 누락 된 내용이 있으면 알려주세요 (아마 DLL 경로가 다를 수 있음).

C:\python27_x86

C:\python33_x64

이제 python33 설치로 작업하려고하는데 글로벌 환경이 python27을 가리키고있는 경우 환경을 이와 같이 업데이트했는지 확인하십시오 ( PATH그리고 선택 사항 PYTHONHOME 일 수 있습니다 (예 : 일시적으로 로컬 셸에서 작업하는 경우)).

PATH="C:\python33_x64;%PATH%"

PYTHONPATH="C:\python33_x64\DLLs;C:\python33_x64\Lib;C:\python33_x64\Lib\site-packages"

PYTHONHOME=C:\python33_x64

참고, 당신이해야 할 수도 있음을 / 당신에게 다른 라이브러리 경로를 추가하려면 PYTHONPATH개발 환경에서 요구하는 경우,하지만 당신을 가지고 DLLs, Lib그리고 site-packages제대로 설정이 가장 중요하다.

도움이 되었기를 바랍니다.


핵심 이유는 매우 간단합니다 : 그것은 물론로드 할 수 없습니다, 그래서 파이썬은 그 모듈 디렉토리를 찾을 수없는 encodings, 너무

임베딩에 관한 Python 문서 는 " Py_Initialize()최상의 추측에 따라 모듈 검색 경로를 계산합니다 "라고 말합니다. ... "특히 lib/pythonX.Y" 라는 이름의 디렉토리를 찾습니다.

그러나 모듈이 lib파이썬 바이너리와 관련하여 (단지) 설치된 경우 위의 추측은 잘못되었습니다.

문서가 있다고하더라도 PYTHONHOMEPYTHONPATH간주, 우리는 그렇지 않은 것을 관찰; 그들의 실제 존재 나 내용은 전혀 관련이 없습니다.

효과를 가지고있는 유일한 방법은를 호출했다 Py_SetPath()예와 [path-to]\lib인수로 이전 Py_Initialize() .

물론 이것은 코드를 직접 액세스하고 제어 할 수있는 임베딩 시나리오에 대한 옵션 일뿐입니다. 기성 솔루션을 사용하면 문제를 해결하기 위해 특별한 단계가 필요할 수 있습니다.


Mac OS에서 brew의 python3을 설치하려고 시도하는 것과 동일한 문제가 발생했습니다! 여기서 문제는 Mac OS에서 homebrew가 "진짜"파이썬을 생각보다 더 깊게 전체 계층에 배치한다는 것입니다. 홈브류 출력을 보면

$ echo $PYTHONHOME
/usr/local/Cellar/python3/3.6.2/
$ echo $PYTHONPATH
/usr/local/Cellar/python3/3.6.2/bin

정확하지만 $ PYTHONPATH / python3을 호출하면 중단 6 "인코딩을 찾을 수 없습니다."와 함께 즉시 충돌합니다. 이것은 $ PYTHONHOME이 bin, lib 등이있는 완전한 설치처럼 보이지만 Mac OS "Framework"에있는 실제 Python이 아니기 때문입니다. 이 작업을 수행:

PYTHONHOME=/usr/local/Cellar/python3/3.x.y/Frameworks/Python.framework/Versions/3.x
PYTHONPATH=$PYTHONHOME/bin

(적절한 버전 번호 대체) 제대로 작동합니다.


python3k에서 시작하려면 PYTHONHOME \ Lib 디렉토리에있는 encodings 모듈이 필요합니다. 실제로 API Py_Initialize () 는 초기화를 수행하고 인코딩 모듈을 가져옵니다. PYTHONHOME \ Lib가 sys.path에 있는지 확인하고 인코딩 모듈이 있는지 확인하십시오.


방금 똑같은 문제가 발생했습니다 (동일한 Python 버전, OS, 코드 등).

프로그램의 작업 디렉토리 (VC에서는 .vcproj가있는 디렉토리)에 Python의 Lib / 디렉토리를 복사하면됩니다.


나는 파이썬 3.5, 아나콘다 3, Windows 7 32 비트 에서이 문제가 발생했습니다. 내 pythonX.lib 및 pythonX.dll 파일을 작업 디렉토리로 이동하고 다음을 호출하여 해결했습니다.

Py_SetPythonHome(L"C:\\Path\\To\\My\\Python\\Installation");

필요한 헤더를 찾을 수 있도록 초기화하기 전에 내 경로는 "... \ Anaconda3 \"입니다. Py_SetPythonHome을 호출하는 추가 단계가 필요했습니다. 그렇지 않으면 파이썬이 파일을 가져올 때 다른 이상한 오류가 발생합니다.


릴리스 빌드에 적절한 코덱을 포함하지 않거나 시스템 API에 사용할 코덱을 잘못 식별하는 데 문제가있는 것 같습니다. python_d실행 파일이 작동 하기 때문에 무엇을 반환 os.getfsencoding()합니까? (C API를 사용하여 Initialize / Finalize 호출간에 호출)


따라서 어떤 이유로 python dll이 encodings 모듈을 찾지 못합니다. python.exe 실행 파일은 예상 상대 경로가 있기 때문에 분명히 찾습니다. 검색 경로 수정이 작동합니다.

이 모든 이유는? 모르지만 적어도 작동합니다. 나는 어딘가에 내 부분에 오타가 있다고 매우 의심하는데, 그것이 일반적으로 이상한 버그의 이유입니다.


I had the problem and was tinkering with different solutions mentioned here. Since I was running my project from Visual Studio, apparently, I needed to set the environment path inside Visual Studio and not the system path.

Adding a simple PYTHONHOME=PATH\TO\PYTHON\DIR in the project solution\properties\environment solved the problem.


For me this happened when I updated Python 64 bit from 3.6.4 to 3.6.5. It threw some error like "unable to extract python.dll. Do you have permissions."

Pycharm also failed to load interpreter, even though I reloaded it in settings. Running python command gave same error, with and without administrator mode.

Reason

There was error in installation of Python, include folder in python installation directory C:\Users\USERNAME\AppData\Local\Programs\Python\Python36 was missing

Reinstalling Python also dint solve the issue.(Not removal and install)

Solution

Uninstall Python and Install of Python again.

Because running installer was just extracting same files excluding include folder


I had the same issue and found this question. However from the answers here I was not able to solve my problem. I started debugging the cpython code and thought that I might be discovered a bug. Therefore I opened a issue on the python issue tracker.

My mistake was that I did not understand that Py_SetPath clears all inferred paths. So one needs to set all paths when calling this function.

For completion I also copied the most important part of the conversation below.


My original issue text

I compiled the source of CPython 3.7.3 myself on Windows with Visual Studio 2017 together with some packages like e.g numpy. When I start the Python Interpreter I am able to import and use numpy. However when I am running the same script via the C-API I get an ModuleNotFoundError.

So the first thing I did, was to check if numpy is in my site-packages directory and indeed there is a folder named numpy-1.16.2-py3.7-win-amd64.egg. (Makes sense because the python interpreter can find numpy)

The next thing I did was to get some information about the sys.path variable created when running the script via the C-API.

#### sys.path content ####
C:\Work\build\product\python37.zip
C:\Work\build\product\DLLs
C:\Work\build\product\lib
C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\PROFESSIONAL\COMMON7\IDE\EXTENSIONS\TESTPLATFORM
C:\Users\rvq\AppData\Roaming\Python\Python37\site-packages

Examining the content of sys.path I noticed two things.

  1. C:\Work\build\product\python37.zip has the correct path 'C:\Work\build\product\'. There was just no zip file. All my files and directory were unpacked. So I zipped the files to an archive named python37.zip and this resolved the import error.

  2. C:\Users\rvq\AppData\Roaming\Python\Python37\site-packages is wrong it should be C:\Work\build\product\Lib\site-packages but I dont know how this wrong path is created.

The next thing I tried was to use Py_SetPath(L"C:/Work/build/product/Lib/site-packages") before calling Py_Initialize(). This led to

Fatal Python Error 'unable to load the file system encoding' ModuleNotFoundError: No module named 'encodings'

I created a minimal c++ project with exact these two calls and started to debug Cpython.

int main()
{
  Py_SetPath(L"C:/Work/build/product/Lib/site-packages");
  Py_Initialize();
}

I tracked the call of Py_Initialize() down to the call of

static int
zipimport_zipimporter___init___impl(ZipImporter *self, PyObject *path)

inside of zipimport.c

The comment above this function states the following:

Create a new zipimporter instance. 'archivepath' must be a path-like object to a zipfile, or to a specific path inside a zipfile. For example, it can be '/tmp/myimport.zip', or '/tmp/myimport.zip/mydirectory', if mydirectory is a valid directory inside the archive. 'ZipImportError' is raised if 'archivepath' doesn't point to a valid Zip archive. The 'archive' attribute of the zipimporter object contains the name of the zipfile targeted.

So for me it seems that the C-API expects the path set with Py_SetPath to be a path to a zipfile. Is this expected behaviour or is it a bug? If it is not a bug is there a way to changes this so that it can also detect directories?

PS: The ModuleNotFoundError did not occur for me when using Python 3.5.2+, which was the version I used in my project before. I also checked if I had set any PYTHONHOME or PYTHONPATH environment variables but I did not see one of them on my system.


Answer

This is probably a documentation failure more than anything else. We're in the middle of redesigning initialization though, so it's good timing to contribute this feedback.

The short answer is that you need to make sure Python can find the Lib/encodings directory, typically by putting the standard library in sys.path. Py_SetPath clears all inferred paths, so you need to specify all the places Python should look. (The rules for where Python looks automatically are complicated and vary by platform, which is something I'm keen to fix.)

Paths that don't exist are okay, and that's the zip file. You can choose to put the stdlib into a zip, and it will be found automatically if you name it the default path, but you can also leave it unzipped and reference the directory.

A full walk through on embedding is more than I'm prepared to type on my phone. Hopefully that's enough to get you going for now.


In my cases, for windows, if you have multiple python versions installed, if PYTHONPATH is pointing to one version the other ones didn't work. I found that if you just remove PYTHONPATH, they all work fine

참고URL : https://stackoverflow.com/questions/5694706/py-initialize-fails-unable-to-load-the-file-system-codec

반응형