Hun*_*ter 2 python pyinstaller cython setup.py cythonize
我有一些Python文件,我想将它们打包成exe并进行商业分发,但也要确保没有人能够看到这些文件的源代码......我听说过pyarmor模块,但它没有提供完全混淆..对此有任何帮助吗?
我听说过有关 Cython 和 Pyinstaller 的内容,但从未让它发挥作用。我看过很多关于如何首先将代码转换为 C 源代码,然后将其编译为 exe 的帖子,但这些都不适合我。这里有人愿意告诉我如何实现相同的目标吗?
所以我们将使用一些模块来 -->
--> 将我们的Python代码转换为C源代码和PYD文件(PYD是DLL文件的Python等效项)
--> 将它们打包成exe
我们需要的模块是 -->
-->赛通
--> py安装程序
我们将使用我的项目文件(作为示例)来演示如何将所有文件转换为 C 源代码和 PYD 文件
我的项目中的文件是 -->
--> 聊天屏幕.py
--> 常量.py
--> main_app.py
--> rooms_list_screen.py
我们将创建另一个文件夹,并命名它Distributable executable files(你可以随意命名)
我们将添加文件夹中的所有 Python 文件,但将所有文件的扩展名从 更改
py为pyx
然后创建另一个文件,称为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
)
Run Code Online (Sandbox Code Playgroud)
所以我们在这里所做的是,使用Extension类来使所有文件成为应用程序的扩展。所以相同的格式是Extension("The name by which u r importing the file (mostly the file name)", ["The full file name with its pyx extension"]
然后我们创建一个setup函数并指定我们之前在 kwarg 中创建的扩展列表ext_modules。但是,我们必须将列表包装在cythonize函数内,以将所有文件编译为 C 源代码和 pyd 文件。
现在,打开命令提示符窗口same folder并运行此命令python setup.py build_ext --inplace并等待。这将输出一些 C 和 PYD 文件。这些是您的 Python 文件,现已编译。
现在,创建另一个名为main.py(请注意该文件的扩展名应该是py而不是 pyx)的文件,并将此代码添加到其中__import__("main_app")(将文件名替换为您的主文件),然后简单地运行它。如果您的脚本运行没有任何错误,则意味着您已准备好将应用程序编译为 exe!
现在,在同一文件夹中安装Pyinstaller和pip install pyinstaller,打开命令提示符并运行pyinstaller main.py并等待。
spec您将在同一目录中看到一个文件以及一个 build 和 dist 文件夹。我们现在可以忽略这两个文件夹。
然后,打开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,
strip=False,
upx=True,
upx_exclude=[],
name='main')
Run Code Online (Sandbox Code Playgroud)
在函数datas的kwarg中Analysis添加以下代码
[
("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", ".")
]
Run Code Online (Sandbox Code Playgroud)
所以我们在这里要做的是,添加在spec 文件中生成的每个C 和pyd 文件,以确保它们进入编译后的exe。表示.文件应保存在exe 目录的根目录中。
hiddenimports另外,在函数的 kwarg中添加您在脚本中执行的导入列表Analysis,在我的例子中是['requests', 'kivy'].. 所以我的规范文件看起来像这样
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['main.py'],
pathex=['Omitted due to privacy concerns'],
binaries=[],
datas=[
("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", ".")
],
hiddenimports=['requests', 'kivy'],
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,
strip=False,
upx=True,
upx_exclude=[],
name='main')
Run Code Online (Sandbox Code Playgroud)
pyinstaller main.spec并按 Enter 键。现在您的文件正在转换为 exe!现在只需等待一段时间,当该过程完成后,只需转到同一文件夹中的以下目录dist\<name>\,您将在这里找到应用程序的所有文件。如果您想启动该应用程序,请查找一个main.exe文件并运行它。您的应用程序现在已准备就绪!如果您想将其制作为单个文件,那么不要只执行pyinstaller main.spec,而是执行pyinstaller main.spec --onefile,它将在同一目录中制作单个可执行文件!
在这种情况下,不要UPX与 Pyinstaller 一起使用,因为它在我的情况下导致了一些随机 DLL 错误,在我不使用 UPX 重新打包后修复了该错误
| 归档时间: |
|
| 查看次数: |
8555 次 |
| 最近记录: |