2017-11-14 5 views
0

cython 파일에 사전 컴파일러 논리를 추가하는 솔루션을 찾고 있습니다.Cython 프리 컴파일러 의사 결정

나는 C++에있는 하드웨어 장치 API를위한 cython 래퍼를 작성했다. 이것은 파이썬 2.7과 3.6을 위해 일반적으로 MSVC를 사용하여 컴파일되는 cython 프로젝트입니다. 전체 패키지는 외부 C++ 또는 헤더 파일없이 cython으로 작성됩니다.

처음에는이 소프트웨어를 Windows 컴퓨터에서 사용하기 위해 작성 했으므로 많은 기본 winapi 기능을 사용하여 커널 이벤트 루프 및 winapi 오류 메시지에 액세스하는 데 도움이되었습니다. 잘 작동하지만 크로스 플랫폼 컴파일 기능을 추가하고 싶습니다. 이것은 내가 리눅스 기계에서 작동하도록하기 위해 몇 가지 주요 기능을 완전히 대체해야한다. 예를 들어 하드웨어 API에는 OS에 따라 다른 이벤트 처리 기능이 있습니다. 또한 winapi 이벤트 처리를 대체해야합니다.

지금은 전체 프로젝트를 단일 모듈로 컴파일하여 가져 오기 작업을 간소화했습니다. 모든 코드는 hwmodule.pyd 파일로 컴파일되는 동일한 pyx 파일에 있습니다. 그러나 크로스 플랫폼 컴파일의 목표를 달성하려면 설치시 여러 개의 작은 pyx 파일에서 파일을 함께 패치해야합니다. 이 솔루션은 우아하고 유지하기 어렵습니다. 말할 것도없이, 이것은 프로젝트에 추가하고 싶은 다른 사람들을 훈련시키기가 더 어렵습니다.

이상적으로는 플래그 또는 변수에 따라 해석되고 컴파일되는 C 컴파일 시간 플래그에 cython을 쓸 수 있습니다. 내 목표를 달성 할 수있는 cython의 솔루션이 있습니까? 또는 우아하고 유지하기 쉬운 다른 조직이 있습니까? 사이 썬이 가능한이라면 우아한 수있다 용액

예 : 주석으로부터 확장

# `#ifdef` 
#ifdef __WINAPI 
def foo(): 
    print('bar win') 
#else 
def foo(): 
    print('bar linux') 
#endif 

#--- 

# `with` block 
with ifdef('__WINAPI'): 
    def foo(): 
     print('bar win') 

#--- 

# line endings 
def foo() ifdef('__WINAPI'): 
    print('bar win') 

def foo() ifndef('__WINAPI'): 
    print('bar win') 
+0

스팸 태그 금지! – Olaf

+1

Cython이 이미 [이와 비슷한 기능을 지원합니다] (http://cython.readthedocs.io/en/latest/src/userguide/language_basics.html#conditional-compilation)? – DavidW

+0

@Olaf 두 언어로 작성된 유효한 해결책이있을 수 있으므로'C++','python','c'에 태그를 추가했습니다. 즉. 'setup.py'에서 파이썬을 사용하거나 특별한 기능을 다루기 위해'C++'파일을 추가하는 것입니다. 이러한 언어 간 기능은 cython으로 가능합니다. 당신이 그것을 이해하지 못했을 때를 대비 한 것은 단지 참고 일뿐입니다. – scicalculator

답변

1

간단한 않음 : 이는 a feature that Cython supports이다. UNAME_SYSNAME 당신을 위해 윈도우, OS X와 ​​리눅스 사이에서 선택할 수 있습니다 :

IF a==5: 
    cdef f(): 
     return 1 
ELSE: 
    cdef f(): 
     return 2 

는 또한 몇 가지 유용한 상수를 정의합니다 : 그것은 당신이 컴파일 시간이

DEF a = 5 

상수 조건부 그 상수에 따라 코드를 포함 정의 할 수 있습니다 예.


이 표현

이 사이 썬이 .pyx 파일을 실행되는 시점에서 평가됩니다 - 따라서 생성 된 C 코드는 리눅스 대 윈도우에 다른이며, 그래서 당신은 당신이해야 다른 플랫폼에서 컴파일하려면 C 파일을 다시 컴파일하는 대신 Cython을 다시 실행하십시오.