programing

사이톤의 setup.py 에서 파이썬 3 소스를 지정하는 방법은 무엇입니까?

javamemo 2023. 6. 4. 10:14
반응형

사이톤의 setup.py 에서 파이썬 3 소스를 지정하는 방법은 무엇입니까?

저는 이 튜토리얼 http://docs.cython.org/src/tutorial/cython_tutorial.html#cython-hello-world 에 따라 싸이톤에서 "헬로 월드" 프로그램을 하려고 합니다.

내가 만든helloworld.pyx

print("Hello World")

그리고.setup.py:

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("helloworld.pyx")
)

튜토리얼에서와 같이 파이썬 2가 아닌 파이썬 3이 내 소스임을 지정하기 위해 setup.py 을 어떻게 변경할 수 있습니까?명령줄에서 "cython" 명령을 호출하면 다음 명령을 수락합니다.-3선택.하지만 만약 내가 컴파일을 한다면,python setup.py build_ext --inplace튜토리얼에 나와 있는 것처럼, 파이썬 3 소스를 어떻게 지정합니까?Hello World 프로그램에는 큰 문제가 되지 않을 수도 있지만, 실제 프로젝트에 싸이톤을 사용하기 시작하면 문제가 될 것입니다.

옵션으로 통과할 수 있습니다.cythonize-의 기능setup.py-script:

ext_modules = cythonize(
               extensions, 
               compiler_directives={'language_level' : "3"}   # or "2" or "3str"
             ) 

다른 가능한 구문은 다음과 같습니다.

ext_modules = cythonize(extensions, language_level = "3")

위의 내용이 추가하는 것보다 더 편리할 수 있습니다.

#cython: language_level=3

프로젝트의 모든 pyx 파일에. Cython 0.29 이후로 경고가 있기 때문에 필요할 수 있습니다.language_level 명시적으로 설정되지 않음:

/Main.py:367 : 미래 경고:Cython 지시어 'language_level'이 설정되지 않았습니다. 지금은 2를 사용합니다(Py2).이 내용은 이후 릴리스에서 변경됩니다!파일: XXXXXX.pyx
tree = Parsing.p_module(s, pxd, full_module_name)


왜냐면language_level세계적인 환경, 장식가입니다.

cimport cython

@cython.language_level("3")
def do_something():
    pass

사이톤화되지도 않을 겁니다

컴파일에 대한 공식 문서에 따르면 Python 언어 수준은 파일 상단에 다음과 같은 특수 헤더 주석을 통해 지시문을 사용하여 지정할 수 있습니다.

#!python
#cython: language_level=3

setup.py 에는 이를 명시할 방법이 없는 것 같습니다.따라서 Cython 파일이 많은 경우 각 파일에 컴파일러 지시문을 추가해야 합니다.제가 지금까지 만난 유일한 상황에서 이 지침이 필요한 것은 당신의 샘플과 같이 print()에 대한 것이고, 저는 싸이톤을 광범위하게 사용했습니다.

예제에서와 같이 확장명이 있는 setup.py 을 사용하는 경우

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [
    Extension("mymodule1",  ["mymodule1.py"]),
    Extension("mymodule2",  ["mymodule2.py"]),
]

setup(
    name = 'My Program Name',
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules
)

그런 다음 language_level 지시어를 적용하려면 다음 스니펫을 추가해야 합니다(설정 전에(...), 감사 코드맨48).

for e in ext_modules:
    e.cython_directives = {'language_level': "3"} #all are Python-3

언급URL : https://stackoverflow.com/questions/34603628/how-to-specify-python-3-source-in-cythons-setup-py

반응형