반응형

기존 Python으로 라이브러리화를 하려고 했는데 해당 소스 코드를 암호화하여 보안성을 높이기 위해 pyinstaller 라이브러리를 사용하여 암호화하려고 했는데 쉽게 복호화가 가능하여 이 문제를 해결하기 위한 방법은 cythonize를 사용하는 것이다.

 

cythonize하는 방법

1. cython 설치

- Anaconda Powershell Prompt에서 아래의 명령어를 실행하여 cython을 설치한다.

pip install cython

 

2. Cythonize를 위환 build 설치

- Cythonize를 하기 위해서는 C++ 14.0 이상의 Build Tool이 필요하기 때문에 설치를 한다. Build Tool 설치 방법은 아래의 링크에서 보고 진행하면 된다.

Build Tool 설치하기

 

building 'TEST' extensionerror: Microsoft Visual C++ 14.0 or greater is required. 문제 해결 방법

Python에서 코드를 Cython cythonize를 하려고 build를 했더니 building 'TEST' extensionerror: Microsoft Visual C++ 14.0 or greater is required 에러가 발생했다. building 'TEST' extension error: Microsoft Visual C++ 14.0 or greater is requir

yongku.tistory.com

 

3. Cythonize를 하기 위한 pyx 파일 만들기

Cythonize를 위해 py 파일 대신 pyx 파일로 사용을 해야 한다. 그렇기에, 따로 바꿀 것은 없고 확장자만 pyx로 바꾸면 된다.

 

test_cy.pyx

def sumFunc(A, B) : 
    return A + B

 

4. setup.py 파일 생성

cythonize를 하기 위한 setup.py 파일을 생성하면 된다.

 

setup.py

from setuptools import setup
from Cython.Build import cythonize

setup(
    name='test_cython',
    ext_modules=cythonize("test_cy.pyx"),
    compiler_directives={'language_level' : "3"} # 파이썬 3버전으로 맞추기 위해 사용
)

 

2개 이상의 파일을 cythonize를 하려고 한다면 리스트를 사용하면 된다.

from setuptools import setup
from Cython.Build import cythonize

setup(
    name='test_cython',
    ext_modules=cythonize(["test_cy.pyx", "test_cy2.pyx"])
)

 

numpy/arrayobject.h': No such file or directory 에러가 발생한다면 아래의 링크에서 문제를 해결 할 수 있다.

 

numpy/arrayobject.h No such file or directory 문제 해결 방법

 

numpy/arrayobject.h': No such file or directory 에러 발생 시 해결 방법

Python py 파일을 Cython으로 cythonize을 하려고 build를 하니 c 확장자 파일은 만들어 졌는데, pyd 파일은 만들어지지 않으면서 numpy/arrayobject.h No such file of directory 에러가 발생했다. fatal error C1083: 포함

yongku.tistory.com

 

5. build 실행

아래의 명령어를 터미널에 실행하여 빌드를 한다.

python3 setup.py build_ext --inplace

 

위의 명령어를 실행하면 현재 경로에서 2개의 파일을 볼 수 있다.(Windows OS 기준)

아래와 같이, c 확장자 파일 1개와 pyd 확장자 파일을 볼 수 있다.

 

여기까지 pyd 파일을 만들었으면 다른 소스 코드에서 해당 pyd를 import를 하면 되는데 여기서 문제가 생겼다.

pyd 파일을 import를 하려고 했는데 dynamic module does not define module export function 이 에러가 발생했다.

 

이 에러를 해결하기 위해 아래와 같은 방법을 다 적용했다.

 

적용 방법

1. python 버전 확인

- 내가 개발하는 환경이 python 3버전이라도 cython 작업을 하다 보면 python 2버전으로 적용이 된다고도 하여 setup.py 파일에 compiler_drectives로 language_level을 3으로 설정했다.

from setuptools import setup
from Cython.Build import cythonize

setup(
    name='test_cython',
    ext_modules=cythonize("test_cy.pyx"),
    compiler_directives={'language_level' : "3"} # 파이썬 3버전으로 맞추기 위해 사용
)

 

 

2. pyd 파일 경로 설정

import를 하기 위해 sys.path 경로를 확인한 결과 해당 경로에 pyd 파일을 정상적으로 이동이 완료된 것을 확인했다.

 

위와 같이 적용을 했는데도 해결이 되지 않아 공식 문서를 찾아보니 pyx 파일을 생성할 때 문제가 있었다.

 

test_cy.pyx 파일을 가지고 cythonize를 했기 때문에 이것을 기반으로 만든 pyd 파일을 import하는 단계는 아래와 같다.

 

  1. 윈도우 해당 경로에 있는 test_cy.pyd 또는 test_cy.dll 검색
  2. 해당 파일 초기화하기 위한 PyInit_test_cy() 함수 호출

위의 단계에서 보면 2번을 빼먹어서 초기화가 되지 않아 import가 되질 않았다. 그렇기 때문에, 아래와 같이 pyx 파일에 PyInit_test_cy 함수를 생성하면 된다.

 

test_cy.pyx

def PyInit_test_cy() : 
	return True

def sumFunc(A, B) : 
    return A + B

 

 

위와 같이 진행을 하고 이제 pyd 파일을 import를 하면 정상적으로 작동되는 것을 확인할 수 있다.

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기