Как «спрятать» некоторые файлы .py в .exe с помощью cx_Freeze? - PullRequest
3 голосов
/ 26 июня 2019

Конверт:

Windows 10
python 3.6.6
cx-Freeze 5.0.2

Пример Git-хаба

Для установки требуется .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) Из корневого каталога (где установлено приложение) я начинаю поиск (с помощью команды grep -Rna в гостевой системе Ubuntu, это просто более удобно для меня), и допустимое значение 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 можно легко преобразовать в исходный файл (без комментариев), например, 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) (решено с помощью этот вопрос ) В обоих пунктах: файл содержит исходный путь G:\heroes\installer-with-cx_Freeze\sources_of_project\some_packet\module_name.py Это сбивает с толкуменя немногоПриложение было установлено с .msi и (как я понимаю) не должно знать о исходных каталогах (относительно пути), которые использовались для создания последних.

Вопросы:

  1. Есть ли способ восстановить some_module.py и some_other_module.py в исходные файлы из main.exe? (Как это можно сделать с помощью lib\some_packet\module_name.pyc)

  2. Как "спрятать"некоторые другие файлы в приложении в main.exe или как-то избежать преобразования .pyc в исходные файлы (возможно, некоторые свойства в cx_Freeze?)

Примечание:

Это должно быть сделано с cx_Freeze.

PS: я не хочу создавать сингл .exe.Я пытаюсь найти удобный способ указать, какие файлы должны храниться в main.exe, как это было сделано с some_module.py и some_other_module.py

PSS: В данный момент я вижу только один способ: положить все файлы наmain.py уровень :) Но для большого проекта это будет выглядеть странно.

Ответы [ 3 ]

2 голосов
/ 08 июля 2019

Цитирование Как запутать исходный код Python :

Эти два метода [использование pyobfuscate и распространение байт-кода] на самом деле являются просто сдерживающим фактором, а не безопасным способом сокрытия кода.

Если вы хотите что-то более надежное, вам следует взглянуть на Nuitka , которая компилирует код Python в C ++, так что вы можете скомпилировать это и просто распространить исполняемый файл. Кажется, он широко совместим с разными библиотеками и разными версиями Python.

См. Также Запутывание кода Python

0 голосов
/ 16 июля 2019

Если я правильно понимаю Ваш вопрос, это может быть ответ. Вы хотите - Python cx_Freeze для двух или более файлов (модулей) Python

0 голосов
/ 16 июля 2019

Это видео может помочь.В нем рассказывается о cxfreeze и о том, как вы можете использовать cxfreeze для создания извиняемого, и я знаю, что это работает для 3.4+, потому что видео использует python 3.4, но на самом деле ваш метод должен быть в порядке ...

...