问题描述
我需要混淆我的python代码,要实现它,我正在使用cythonize扩展,我能够实现它,并从a.py文件中获取二进制编译的a.so文件,但是在执行bdist_wheel之后,仅.whl包会打包a.so文件,并忽略resource_folder.
I need to obfuscate my python code, to achieve it I am using cythonize extension, I am able to achieve it and get the binary compiled a.so files from a.py files but after doing bdist_wheel the .whl package only packages the a.so files and ignores the resource_folder.
我的项目文件结构是
|main_project
|__,setup.py
|__,main_folder
|____,a.py
|____,__init__.py
|____resource_folder
|__,a.model
|__,a.json
我使用了以下链接来制作模糊的python wheel包,
I used following links to make obfuscated python wheel package,
https://bucharjan.cz/blog /using-cython-to-protect-a-python-codebase.html
https://medium.com/@xpl/protecting -python-sources-using-cython-dcd940bb188e
仅打包二进制文件用Cython编译的python库的已编译.so文件
以下是我的setup.py中的摘录
Following is the snippet from my setup.py
packages = find_packages(exclude=('tests',))
def get_package_files_in_directory(directory):
paths = []
for (path, directories, filenames) in os.walk(directory):
for filename in filenames:
paths.append(os.path.join('..', path, filename))
return paths
setup(
packages=[],
ext_modules=cythonize(
[
Extension("main_folder.*", ["main_folder/*.py"])
],
build_dir="build",
compiler_directives=dict(
always_allow_keywords=True
)),
package_data={p: package_files + get_package_files_in_directory(os.path.join(here, p, 'resources')) for p in packages},
,....
,...
)
要打包,我正在使用以下命令
To package I am using following command
python setup.py build_ext
python setup.py build_ext
python setup.py bdist_wheel
python setup.py bdist_wheel
预期结果是包含.so文件和资源文件夹的.whl文件
expected result is .whl file containing a.so file and resource folder
实际结果是.whl文件仅包含一个.so文件.
actual result is .whl file contain only a.so file.
还要打包此链接中建议的我使用的get_package_files_in_directory()函数()",但这对我也不起作用
to also package the resource_folder I used get_package_files_in_directory() function as suggested in this link "( How do you add additional files to a wheel?)" but this also didnot work for me
推荐答案
基于答案,由@hoefling 我能够打包resource_folder并混淆了二进制a.so文件.
Based on this Answer by @hoefling I was able to package my resource_folder and obfuscated binary a.so file.
setup.py的食谱
The recipe for setup.py
from Cython.Distutils import build_ext
from Cython.Build import cythonize
from setuptools.extension import Extension
from setuptools.command.build_py import build_py as build_py_orig
from pathlib import Path
from setuptools import find_packages, setup, Command
import os
import shutil
here = os.path.abspath(os.path.dirname(__file__))
packages = find_packages(exclude=('tests',))
def get_package_files_in_directory(directory):
paths = []
for (path, directories, filenames) in os.walk(directory):
for filename in filenames:
paths.append(os.path.join('..', path, filename))
return paths
#to copy the __init__.py as specified in above references links
class MyBuildExt(build_ext):
def run(self):
build_ext.run(self)
build_dir = Path(self.build_lib)
root_dir = Path(__file__).parent
target_dir = build_dir if not self.inplace else root_dir
self.copy_file(Path('main_folder') / '__init__.py', root_dir, target_dir)
def copy_file(self, path, source_dir, destination_dir):
if not (source_dir / path).exists():
return
shutil.copyfile(str(source_dir / path), str(destination_dir / path))
#as specified by @hoefling to ignore .py and not resource_folder
class build_py(build_py_orig):
def build_packages(self):
pass
setup(
packages=find_packages(), # needed for obfuscation
ext_modules=cythonize(
[
Extension("main_folder.*", ["main_folder/*.py"])
],
build_dir="build",
compiler_directives=dict(
always_allow_keywords=True
)),
package_data={p: get_package_files_in_directory(os.path.join(here, p, 'resource_folder')) for p in packages}, #package_data as found in another reference
cmdclass={
'build_py': build_py
},
entry_points={
},
)
要创建模糊的* .whl软件包命令集
To create obfuscated *.whl package set of commands
python setup.py build_ext #creates the a.so
python setup.py build_py #copies the resource_folder excluding .py
python setup.py bdist_wheel # then whl generation
这篇关于仅打包cythonized二进制python文件和资源数据,但忽略python .py源文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!