隐藏 python 源代码以防止人们看到它..完整和正确的方法
Hiding python source code to prevent people from seeing it.. The whole and proper way
我有几个 Python 文件,我想将它们打包成一个 exe 并进行商业分发,但是 还要确保 没有one 能够看到文件的源代码...我听说过 pyarmor
模块,但它不提供完全混淆。对此有任何帮助吗?
我听说过有关 Cython 和 Pyinstaller 的信息,但从未使用过。我看过很多关于如何首先将代码转换为 C 源代码,然后将其编译为 exe 的帖子,但是 none 对我有用。这里有人愿意告诉我如何实现相同的目标吗?
所以我们将使用一些模块 -->
--> 将我们的 Python 代码转换为 C 源代码和 PYD 文件(PYD 是 Python 等同于 DLL 文件)
--> 将它们打包成一个 exe
我们需要的模块是 -->
--> Cython
--> Pyinstaller
我们将使用我的项目文件(作为示例)来演示如何将所有文件转换为 C 源代码和 PYD 文件
我项目中的文件是-->
--> chat_screen.py
--> constants.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
)
所以我们在这里做的是,使用 Extension class 将所有文件制作为应用程序的扩展。所以相同的格式是 Extension("The name by which u r importing the file (mostly the file name)", ["The full file name with its pyx extension"]
然后我们正在制作一个setup function and specifying the list of the extensions we made earlier in the ext_modules
kwarg.. But, we have to wrap the list inside of the cythonize函数,将所有文件编译成C源代码和pyd文件。
现在,打开命令提示符window,在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')
在Analysis
函数的datas
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目录的根目录下。
此外,在 Analysis
函数的 hiddenimports
kwarg 中添加您在脚本中执行的导入列表,在我的例子中是 ['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')
- 现在,在同一文件夹的命令提示符 window 中,键入
pyinstaller main.spec
并按 Enter 键。现在您的文件正在转换为 exe!现在只需等待一段时间,当该过程完成后,只需转到同一文件夹中的以下目录 dist\<name>\
,您将在此处找到您的应用程序的所有文件。如果您想启动该应用程序,请查找 main.exe
文件并 运行 它.. 现在,您的应用程序已准备就绪!!!
如果你想把它变成一个文件,那么不要只做pyinstaller main.spec
,而是做pyinstaller main.spec --onefile
,它会在同一个目录中生成一个可执行文件!!!
在这种情况下不要将 UPX
与 Pyinstaller 一起使用,因为在我的情况下它会导致一些随机 DLL 错误,在我重新打包后不使用 UPX
我有几个 Python 文件,我想将它们打包成一个 exe 并进行商业分发,但是 还要确保 没有one 能够看到文件的源代码...我听说过 pyarmor
模块,但它不提供完全混淆。对此有任何帮助吗?
我听说过有关 Cython 和 Pyinstaller 的信息,但从未使用过。我看过很多关于如何首先将代码转换为 C 源代码,然后将其编译为 exe 的帖子,但是 none 对我有用。这里有人愿意告诉我如何实现相同的目标吗?
所以我们将使用一些模块 -->
--> 将我们的 Python 代码转换为 C 源代码和 PYD 文件(PYD 是 Python 等同于 DLL 文件)
--> 将它们打包成一个 exe
我们需要的模块是 -->
--> Cython
--> Pyinstaller
我们将使用我的项目文件(作为示例)来演示如何将所有文件转换为 C 源代码和 PYD 文件
我项目中的文件是-->
--> chat_screen.py
--> constants.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
)
所以我们在这里做的是,使用 Extension class 将所有文件制作为应用程序的扩展。所以相同的格式是 Extension("The name by which u r importing the file (mostly the file name)", ["The full file name with its pyx extension"]
然后我们正在制作一个setup function and specifying the list of the extensions we made earlier in the ext_modules
kwarg.. But, we have to wrap the list inside of the cythonize函数,将所有文件编译成C源代码和pyd文件。
现在,打开命令提示符window,在
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')
在Analysis
函数的datas
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目录的根目录下。
此外,在 Analysis
函数的 hiddenimports
kwarg 中添加您在脚本中执行的导入列表,在我的例子中是 ['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')
- 现在,在同一文件夹的命令提示符 window 中,键入
pyinstaller main.spec
并按 Enter 键。现在您的文件正在转换为 exe!现在只需等待一段时间,当该过程完成后,只需转到同一文件夹中的以下目录dist\<name>\
,您将在此处找到您的应用程序的所有文件。如果您想启动该应用程序,请查找main.exe
文件并 运行 它.. 现在,您的应用程序已准备就绪!!!
如果你想把它变成一个文件,那么不要只做pyinstaller main.spec
,而是做pyinstaller main.spec --onefile
,它会在同一个目录中生成一个可执行文件!!!
在这种情况下不要将 UPX
与 Pyinstaller 一起使用,因为在我的情况下它会导致一些随机 DLL 错误,在我重新打包后不使用 UPX