【问题标题】:How to "hide" some .py files into .exe with cx_Freeze?如何使用 cx_Freeze 将一些 .py 文件“隐藏”到 .exe 中?
【发布时间】:2019-11-08 14:32:54
【问题描述】:

环境:

Windows 10
蟒蛇 3.6.6
cx-冻结 5.0.2

Git hub example

它包含.msi用于安装

示例项目结构:

/package_name
        /some_packet
            /__init.py
            /module_name.py  # for an example contains valiable in code "module_1"
    /main.py
    /setup.py
    /some_module.py  # for an example contains valiable "module_2"
    /some_other_module.py  # for an example contains valiable "module_3"

setup.py 示例(简体)

import cx_Freeze

cx_Freeze.setup(
    name="example",
    options={
        "build_exe": {
            "packages": ["asyncio"],
            "include_files": ["static\some_static_file.png"]
        },
        "bdist_msi": {
            "upgrade_code": "{492de237-1853-4599-a707-c283d567699f}"
        }
    },
    executables=[cx_Freeze.Executable("main.py")]
)

当前行为

用于创建.msi 安装文件-> 运行命令python setup.py bdist_msi。它将生成.msi 用于安装应用程序的文件。

安装此应用程序后:目录(安装应用程序的位置)将包含:

  • main.exe
  • lib\some_packet目录
  • lib\some_packet\module_name.pyc文件
  • 其他文件

有以下说法:

1) 从根目录(安装应用程序的地方)开始搜索(通过 Ubuntu 来宾系统下的grep -Rna 命令,这对我来说更方便)并且可以在目录中找到有效的module_1(在lib\some_packet\module_name.pyc ) 和 module_2/module_3 找不到。
详情:

(v_decompile) any@any-pc:/mnt/hgfs/shar/example_installed$ grep -Rna "module_1" 
lib/some_packet/module_name.pyc:2:B�!]�@dZdS)module_1N)r�rr�PG:\heroes\installer-with-cx_Freeze\sources_of_project\some_packet\module_name.py<module>s 
(v_decompile) any@any-pc:/mnt/hgfs/shar/example_installed$ grep -Rna -a "module_2" 
(v_decompile) any@any-pc:/mnt/hgfs/shar/example_installed$ grep -Rna -a "module_3"

2) 文件lib\some_packet\module_name.pyc 可以很容易地转换为原始文件(没有 cmets),例如python-uncompyle6.
详情:

(v_decompile) any@any-pc:/mnt/hgfs/shar/example_installed$ uncompyle6 lib/some_packet/module_name.pyc 
# uncompyle6 version 3.3.3 
# Python bytecode 3.6 (3379) 
# Decompiled from: Python 3.6.6 (default, Jul 20 2018, 15:39:05) 
# [GCC 4.8.4] 
# Embedded file name: G:\heroes\installer-with-cx_Freeze\sources_of_project\some_packet\module_name.py 
# Compiled at: 2019-07-07 11:28:50 
module_1 = 'module_1' 
# okay decompiling lib/some_packet/module_name.pyc

3) (用this question 解决)在这两点上:文件包含源路径G:\heroes\installer-with-cx_Freeze\sources_of_project\some_packet\module_name.py 这让我有点困惑。应用程序是从.msi 安装的,并且(据我所知)不应该知道用于创建最后一个的源目录(关于路径)。

问题:

  1. 有什么方法可以将some_module.pysome_other_module.pymain.exe恢复到原始文件?(就像lib\some_packet\module_name.pyc一样)

  2. 如何将应用程序中的一些其他文件“隐藏”到main.exe 或以某种方式避免将.pyc 转换为原始文件。(可能是cx_Freeze 中的某些属性?)

注意:

应该使用cx_Freeze

PS:我不想创建单个.exe。我试图找到一种方便的方法来指定哪些文件应该存储在main.exe 中,就像使用some_module.pysome_other_module.py 一样

PSS:此时我只看到我的方式:将所有文件放在main.py 级别:) 但是对于大项目来说它看起来很奇怪。

【问题讨论】:

  • documentationcx_freeze不支持构建单个文件的exe。
  • @HenryYik 是的,我已经读过,但是如果我将所有文件都放在main.py 级别-它将包含在.exe 中:) 因此我认为有一些方便的方法可以对所有文件执行相同操作。
  • 您自己的话:“此时我只看到我的方式:将所有文件放在main.py 级别”也反映了我对您的问题的看法。
  • 关于您的观点 3)“应用程序 [...] 不应该知道源目录(关于路径)”:也许 this answer 中描述的 cx_Freeze 选项 replace_paths 可以帮助您解决这一点?
  • @jpeg yeap :) 它有助于#3

标签: python python-3.x pyinstaller cx-freeze decompiling


【解决方案1】:

引用How to obfuscate Python source code:

这两种方法[使用pyobfuscate和分发字节码]实际上只是一种威慑,而不是一种隐藏代码的安全方式。

如果你想要更健壮的东西,你应该看看Nuitka,它将 Python 代码编译为 C++,这样你就可以编译它并分发可执行文件。它似乎与不同的库和不同版本的 Python 广泛兼容。

另见Python Code Obfuscation

【讨论】:

  • 会作为一个选项来看看。
  • 好吧,nuitka 看起来很不方便(特别是一点 - 你应该保留 2 个版本的 python 并以某种方式与它们成为朋友),我猜 nuitka 是另一个问题。无论如何感谢您的链接。
【解决方案2】:

这个video 可能会有所帮助。 它讨论了 cxfreeze 以及如何使用 cxfreeze 制作可执行文件,我知道它适用于 3.4+,因为视频使用 python 3.4,但实际上你的方法应该没问题......

【讨论】:

  • 嗯,这个视频只是“创建可执行文件”的主题。它对我当前的问题不是很有用。但无论如何感谢这个链接,对初学者很有用。
  • 我真的不明白你的问题。
  • 重点是在创建执行文件时隐藏多个源文件。正如我在Note 部分中提到的那样:我不看如何使用所有库创建单个可执行文件,因为使用 cx_Freeze 是不可能的。
  • 在“隐藏”文件下,我并不是说将文件标记为“隐藏”,而是将源 .py 包含到 .exe 文件中。所以第二个链接根本不是关于主题的。
【解决方案3】:

如果我正确理解您的问题,这可能是您想要的答案 - Python cx_Freeze for two or more python files (modules)

【讨论】:

  • 不,答案是 It will create 3 .exe files, for each one of your scripts.if any of those files are separate script file。就我而言,我需要“覆盖/隐藏/避免反编译”几个模块(.py)。
  • 我试过了,安装后文件lib\some_packet\module_name.pyc仍然存在,可以反编译。我添加了executables=[cx_Freeze.Executable("main.py"), cx_Freeze.Executable("some_packet\module_name.py")]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多