기존 Python으로 라이브러리화를 하려고 했는데 해당 소스 코드를 암호화하여 보안성을 높이기 위해 pyinstaller 라이브러리를 사용하여 암호화하려고 했는데 쉽게 복호화가 가능하여 이 문제를 해결하기 위한 방법은 cythonize를 사용하는 것이다.
cythonize하는 방법
1. cython 설치
- Anaconda Powershell Prompt에서 아래의 명령어를 실행하여 cython을 설치한다.
pip install cython
2. Cythonize를 위환 build 설치
- Cythonize를 하기 위해서는 C++ 14.0 이상의 Build Tool이 필요하기 때문에 설치를 한다. Build Tool 설치 방법은 아래의 링크에서 보고 진행하면 된다.
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 문제 해결 방법
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하는 단계는 아래와 같다.
- 윈도우 해당 경로에 있는 test_cy.pyd 또는 test_cy.dll 검색
- 해당 파일 초기화하기 위한 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를 하면 정상적으로 작동되는 것을 확인할 수 있다.
'Language > Python' 카테고리의 다른 글
[Python] 파이썬 NaN 다른 문자열로 처리하는 방법 (0) | 2024.05.20 |
---|---|
[Python/pygame] pygame.event.get() QUIT에 대한 정리 (0) | 2024.03.21 |
stat: path should be string, bytes, os.PathLike or integer, not list 문제 해결 방법 (0) | 2024.02.28 |
[Python/Pandas] csv 파일 읽어올 때 앞에 0까지 읽어오는 방법 (0) | 2024.02.20 |
[PYTHON] No module named 'cx_oracle' 문제 해결하기 (0) | 2024.01.19 |
[Python] 파이썬 빠른 입출력(sys 모듈) (0) | 2023.12.27 |
[백준] 백준 30394번 회전하지 않는 캘리퍼스 파이썬(Python) (0) | 2023.12.14 |
[Python] 파이썬 출력함수 print() 사용법 및 예제 (1) | 2023.12.13 |
최근댓글