隐藏python源代码以防止人们看到它..完整正确的方法

问题描述

我有几个 Python 文件,我想将它们打包成一个 exe 并进行商业分发,还要确保没有人能够看到源代码文件代码......我听说过 pyarmor 模块,但它没有提供完全的混淆......对此有任何帮助吗?

我听说过关于 Cython 和 Pyinstaller 的东西,但从来没有让它工作。我看过很多关于如何首先将代码转换为 C 源代码,然后将其编译为 exe 的帖子,但没有一个我有用..这里有人愿意告诉我如何实现相同的目标吗?

解决方法

所以我们将使用一些模块 -->

--> 将我们的 Python 代码转换为 C 源代码和 PYD 文件(PYD 是 Python 中的 DLL 文件)

--> 打包成exe


我们需要的模块是 -->

--> Cython

--> Pyinstaller


我们将使用我的项目文件(作为示例)来演示如何将所有文件转换为 C 源代码和 PYD 文件

我项目中的文件是-->

--> chat_screen.py

--> 常量.py

--> main_app.py

--> rooms_list_screen.py


  1. 我们将创建另一个文件夹,并将其命名为 Distributable executable files(您可以将其命名为 随心所欲)

  2. 我们将添加文件夹中的所有 Python 文件更改扩展名 所有文件从pypyx

  3. 然后创建另一个文件,称为 setup.py 并向其添加以下代码(注意该文件的扩展名应该是 py不是 pyx)


setup.py 文件:

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

ext_modules = [
    Extension("chat_screen",["chat_screen.pyx"]),Extension("constants",["constants.pyx"]),Extension("rooms_list_screen",["rooms_list_screen.pyx"]),Extension("main_app",["main_app.pyx"])
]
setup(name='My Cython App',cmdclass={'build_ext': build_ext},ext_modules=cythonize(ext_modules),compiler_directives={'language_level': 3},zip_safe=False
      )

所以我们在这里做的是,使用 Extension 类来制作所有文件,作为应用程序的扩展。所以相同的格式是 Extension("The name by which u r importing the file (mostly the file name)",["The full file name with its pyx extension"]

然后我们创建一个 setup 函数并指定我们之前在 ext_modules kwarg 中创建的扩展列表。但是,我们必须将列表包装在里面cythonize 函数将所有文件编译为 C 源代码和 pyd 文件。


  1. 现在,在 same folder 中打开命令提示符窗口并运行此命令 python setup.py build_ext --inplace 并等待。这将输出一些 C 和 PYD 文件。这些是您的 Python 文件,现在已编译。

  2. 现在,创建另一个名为 main.py 的文件(注意该文件的扩展名应该是 py不是 pyx) 并将此代码添加到它 __import__("main_app") (用您的主文件替换文件名),然后简单地运行它。如果您的脚本正常运行且没有任何错误,则意味着您已准备好将您的应用编译为 exe!

  3. 现在,使用 pip install pyinstaller 安装 Pyinstaller,并在同一文件夹中,打开命令提示符并运行 pyinstaller main.py 并等待。

  4. 您将在同一目录中看到一个 spec 文件以及一个 build 和 dist 文件夹。我们现在可以忽略这两个文件夹。

  5. 然后,打开spec文件,你会看到里面有这样的东西


block_cipher = None


a = Analysis(['main.py'],pathex=['Omitted due to privacy concerns'],binaries=[],datas=[],hiddenimports=[],hookspath=[],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)
pyz = PYZ(a.pure,a.zipped_data,cipher=block_cipher)
exe = EXE(pyz,a.scripts,[],exclude_binaries=True,name='main',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,console=True )
coll = COLLECT(exe,a.binaries,a.zipfiles,a.datas,upx_exclude=[],name='main')

datas 函数的 Analysis kwarg 中,添加以下代码

[
                 ("chat_screen.c","."),("chat_screen.cp39-win_amd64.pyd",("constants.c",("constants.cp39-win_amd64.pyd",("main_app.c",("main_app.cp39-win_amd64.pyd",("rooms_list_screen.c",("rooms_list_screen.cp39-win_amd64.pyd",".")
             ]

所以我们在这里要做的是,添加在规范文件中生成的每个 C 和 pyd 文件,以确保它们进入已编译的 exe。 . 表示文件应保存在 exe 目录的根目录中。

此外,将您在脚本中执行的导入列表添加到 hiddenimports 函数的 Analysis kwarg 中,在我的例子中是 ['requests','kivy'] .. 所以我的规范文件看起来像这样

# -*- mode: python ; coding: utf-8 -*-
block_cipher = None


a = Analysis(['main.py'],datas=[
                 ("chat_screen.c",".")
             ],hiddenimports=['requests','kivy'],name='main')


  1. 现在,在同一文件夹的命令提示符窗口中,输入 pyinstaller main.spec 并按 Enter 键。现在您的文件正在转换为 exe !现在等待一段时间,当该过程完成时,只需转到同一文件夹 dist\<name>\ 中的以下目录,您将在此处找到您的应用程序的所有文件。如果您想启动应用程序,请查找 main.exe 文件并运行它。在那里,您的应用程序现已准备就绪!!!

如果你想把它做成单个文件,那么不要只做pyinstaller main.spec,而是做pyinstaller main.spec --onefile,它会在同一个目录下创建一个可执行文件!!!

在这种情况下不要将 UPX 与 Pyinstaller 一起使用,因为在我的情况下它会导致一些随机的 DLL 错误,在我不使用 UPX 重新打包后得到修复