복붙노트

[PYTHON] Cython 패키지와 __init __. pyx : 가능한가?

PYTHON

Cython 패키지와 __init __. pyx : 가능한가?

__init __. pyx (__init__.so로 컴파일)를 사용하여 Python 2.7 패키지를 만들 수 있습니까? 그렇다면 어떻게? 나는 그것을 행하는 어떤 운도 가지지 않고 있었다.

다음은 내가 시도한 것입니다.

위의 동작은 다음과 같습니다.

$ python -c 'import foo; foo.hello_world()'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named foo

이 Hg 커밋에 의해 수정 된 Python 이슈 # 15576을 보았습니다. 파이썬 Hg 저장소의 Git 미러에서 동등한 Git 커밋을 살펴보면 커밋이 Python v2.7.5 태그 (모든 후속 v2.7.x 버전)에서 도달 할 수 있음을 알 수 있습니다. 회귀가 있었습니까?

해결법

  1. ==============================

    1.이 정말로 오래된 메일 링리스트 게시물에 따르면, __init__.py 파일을 가지고 있다면 작동합니다 (__init__.py 파일은 사용되지 않지만 디렉토리가 모듈로 취급되기 때문에 필요합니다. 따라서 __init__.so 로드 할 파일).

    이 정말로 오래된 메일 링리스트 게시물에 따르면, __init__.py 파일을 가지고 있다면 작동합니다 (__init__.py 파일은 사용되지 않지만 디렉토리가 모듈로 취급되기 때문에 필요합니다. 따라서 __init__.so 로드 할 파일).

    __init__.py를 추가하면 :

    # an exception just to confirm that the .so file is loaded instead of the .py file
    raise ImportError("__init__.py loaded when __init__.so should have been loaded")
    

    귀하의 예제는 Linux Python 2.7.3에서 작동합니다.

    $ python -c 'import foo; foo.hello_world()'
    hello world
    blah
    

    이것은 버기 코너 케이스의 모든 징후가 있으므로 아마도 권장하지 않습니다. Windows에서 이것은 나를주는 것은 효과가없는 것 같습니다.

    ImportError: DLL load failed: %1 is not a valid Win32 application.
    

    부록 (약간의 추가 상황에 대한) :

    이 동작은 명시 적으로 문서화 된 것 같지 않습니다. Python 1.5 시대의 패키지에 대한 원래 설명에서 그들은 다음과 같이 말합니다.

    관측 된 동작은 확실히 이것과 일치합니다 - 디렉토리를 패키지로 취급하는 데 필요한 __init__.py하지만 .so 파일은 .py 파일보다 우선적으로로드되지만 거의 모호하지 않습니다.

    Cython의 관점에서 볼 때이 동작은 표준 라이브러리를 컴파일하는 데 사용 된 것으로 보입니다 (이 경우 __init__.py가 항상 제공되었을 것입니다). 또는 https://github.com/cython/cython/blob에 주어진 테스트 케이스에서 /master/tests/build/package_compilation.srctree (및 몇 가지 다른 예제들). 이것들에서 "srctree"파일은 __init__.py (및 다른 파일들)을 포함하는 다양한 폴더로 확장되어 컴파일 된 것처럼 보입니다. __init__.so 만 가지고 테스트 한 적이 없을 수도 있습니다.

  2. ==============================

    2.상대 가져 오기를 사용해보십시오.

    상대 가져 오기를 사용해보십시오.

    __init__ :

    에서. 가져 오기 표시 줄

    출신 일 수도 있습니다. foo 가져 오기. Python 2 cython을 잠시 사용하지 않았습니다.

  3. from https://stackoverflow.com/questions/28261147/cython-package-with-init-pyx-possible by cc-by-sa and MIT license