Перейти к содержимому

Как скомпилировать папку в exe

  • автор:

Windows admin blog

Полезные команды cmd, powershell, администрирование, фичи и решения проблем на win/winserver

Как встроить в exe дополнительные файлы — сборка exe через WinRAR

В случае написания какой-либо программы, может возникнуть необходимость включить в exe файл дополнительные файлы (будь то модули, библиотеки, файлы конфигураций, сертификаты или пр.), т.е. стоит задача создать один единый exe файл, внутри которого будет все необходимое. В этом может помочь WinRAR. С его помощью мы можем создать самораспаковывающийся SFX-архив, который распакует в одну папку все необходимое и запустит нужный нам файл.

Разместим в папку с нашим проектом все необходимые файлы. В моем случае это уже ранее собранный exe файл на питоне, которому для корректной работы требуется несколько файлов, но распространять программу в таком виде не очень удобно (хочется все одним файлом).

Выделяем все файлы, жмем ПКМ — добавить в архив

Отмечаем ZIP и ставим галочку «Создать SFX-архив», также можно указать свое имя архива (по умолчанию он берет название папки)

Переходим на вкладку Дополнительно и жмем «Параметры SFX»

В поле «Путь для распаковки» ставим любой символ (например, 1), чтобы стали активны чекбоксы и отмечаем «Создать в текущей папке»

Затем очищаем путь, а выбранный чекбокс останется

Переходим на следующую вкладку «Установка» и указываем файл, который необходимо запускать после того, как наш архив распакуется. В моем случае это основной exe файл с программой cert-install.exe

На вкладке «Режимы» отмечаем галочку «Распаковать во временную папку» и выбираем чекбокс «Скрыть все»

На вкладке «Текст и графика» можно указать путь к иконке, чтобы наш exe файл выглядел более красиво

На этом, в общем-то и все. Жмем ОК и еще раз ОК и в нашей папке появится готовый exe файл, на котором красуется выбранная нами иконка. Круто, не правда ли?

На самом деле, как мы помним, это самораспаковывающийся архив и вы можете его открыть (посмотреть содержимое) через тот же winrar — и что же мы видим: внутри лежат все добавленные нами файлы.

Когда мы запустим наш exe файл, то во временную папку распакуется все его содержимое и запустится файл, который мы указывали в параметрах установки (выполнить после распаковки). В моем случае запустится файл cert-install.exe и для его работы будут использованы все необходимые файлы, которые лежат с ним в одной папке.

Параметры SFX-архива можно изменить на свое усмотрение, а не четко следовать данной инструкции, все зависит от ваших целей и задач. Например, можно не ставить галочку «распаковать во временную папку», тогда все будет распаковываться туда, откуда запускается exe.

Как скомпилировать файлы и папки в один .exe

Я экспортировал все внутриновсти спомощью dotPeek, получил папки и файлы. Мне нужно было немного подкоректировать код(добавить пару ссылок), я сделал всё что нужно, но тут следующая проблема, я декомпилировал и экспортировать смог а вот скомпилировать ПАПКИ и ФАЙЛИ по типу .cs , .csproj , .sln , и другие. Вот как скомпилировать папки и файлы обратно в один .exe?(Желательно без Visual studio и Visual studio code)

Отслеживать

48.6k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков

Как создать exe файл для Python кода с помощью PyInstaller

Установка PyInstaller не отличается от установки любой другой библиотеки Python.

pip install PyInstaller 

Вот так можно проверить версию PyInstaller.

pyinstaller --version

Я использую PyInstaller версии 4.2.

Создание exe файла с помощью PyInstaller

PyInstaller собирает в один пакет Python-приложение и все необходимые ему библиотеки следующим образом:

  1. Считывает файл скрипта.
  2. Анализирует код для выявления всех зависимостей, необходимых для работы.
  3. Создает файл spec, который содержит название скрипта, библиотеки-зависимости, любые файлы, включая те параметры, которые были переданы в команду PyInstaller.
  4. Собирает копии всех библиотек и файлов вместе с активным интерпретатором Python.
  5. Создает папку BUILD в папке со скриптом и записывает логи вместе с рабочими файлами в BUILD.
  6. Создает папку DIST в папке со скриптом, если она еще не существует.
  7. Записывает все необходимые файлы вместе со скриптом или в одну папку, или в один исполняемый файл.

Если использовать параметр команды onedir или -D при генерации исполняемого файла, тогда все будет помещено в одну папку. Это поведение по умолчанию. Если же использовать параметр onefile или -F , то все окажется в одном исполняемом файле.

Возьмем в качестве примера простейший скрипт на Python c названием simple.py, который содержит такой код.

 
 
import time name = input("Введите ваше имя ") print("Ваше имя ", name) time.sleep(5)

Создадим один исполняемый файл. В командной строке введите:

pyinstaller --onefile simple.py 

После завершения установки будет две папки, BUILD и DIST, а также новый файл с расширением .spec. Spec-файл будет называться так же, как и файл скрипта.

папки, BUILD и DIST, а также файл .spec

Python создает каталог распространения, который содержит основной исполняемый файл, а также все динамические библиотеки.

 исполняемый файл

Вот что произойдет после запуска файла.

Добавление файлов с данными

Также, открыв spec-файл, можно увидеть раздел datas, в котором указывается, что файл netflix_titles.csv копируется в текущую директорию.

. a = Analysis(['simple1.py'], pathex=['E:\\myProject\\pyinstaller-tutorial'], binaries=[], datas=[('netflix_titles.csv', '.')], . 

Запустим файл simple1.exe, появится консоль с выводом: Всего фильмов: 7787 .

Добавление файлов с данными и параметр onefile

Если задать параметр --onefile , то PyInstaller распаковывает все файлы в папку TEMP, выполняет скрипт и удаляет TEMP. Если вместе с add-data указать onefile, то нужно считать данные из папки. Путь папки меняется и похож на «_MEIxxxxxx-folder».

 
 
import time import sys import os # pip install pandas import pandas as pd def count_records(): os.chdir(sys._MEIPASS) data = pd.read_csv('netflix_titles.csv') print("Всего фильмов:", data.shape[0]) if __name__ == "__main__": count_records() time.sleep(5)

Скрипт обновлен для чтения папки TEMP и файлов с данными. Создадим exe-файл с помощью onefile и add-data.

pyinstaller --onefile --add-data "netflix_titles.csv;." simple1.py

После успешного создания файл simple1.exe появится в папке DIST.

Можно скопировать исполняемый файл на рабочий стол и запустить, чтобы убедиться, что нет никакой ошибки, связанной с отсутствием файла.

Добавление файлов с данными и параметр onefile

Дополнительные импорты с помощью Hidden Imports

Исполняемому файлу требуются все импорты, которые нужны Python-скрипту. Иногда PyInstaller может пропустить динамические импорты или импорты второго уровня, возвращая ошибку ImportError: No module named …

Для решения этой ошибки нужно передать название недостающей библиотеки в hidden-import.

Например, чтобы добавить библиотеку os, нужно написать вот так:

pyinstaller --onefile --add-data "netflix_titles.csv;." — hidden-import "os" simple1.py

Файл spec

Файл spec — это первый файл, который PyInstaller создает, чтобы закодировать содержимое скрипта Python вместе с параметрами, переданными при запуске.

PyInstaller считывает содержимое файла для создания исполняемого файла, определяя все, что может понадобиться для него.

Файл с расширением .spec сохраняется по умолчанию в текущей директории.

Если у вас есть какое-либо из нижеперечисленных требований, то вы можете изменить файл спецификации:

  • Собрать в один бандл с исполняемым файлы данных.
  • Включить другие исполняемые файлы: .dll или .so.
  • С помощью библиотек собрать в один бандл несколько программы.

Например, есть скрипт simpleModel.py, который использует TensorFlow и выводит номер версии этой библиотеки.

 
 
import time import tensorflow as tf def view_model(): print(tf.__version__) if __name__ == "__main__" : model = view_model() time.sleep(5)

Компилируем модель с помощью PyInstaller:

pyinstaller -F simpleModel.py

После успешной компиляции запускаем исполняемый файл, который возвращает следующую ошибку.

. File "site-packages\tensorflow_core\python_init_.py", line 49, in ImportError: cannot import name 'pywrap_tensorflow' from 'tensorflow_core.python' 

Исправим ее, обновив файл spec. Одно из решений — создать файл spec.

$ pyi-makespec simpleModel.py -F wrote E:\pyinstaller-tutorial\simpleModel.spec now run pyinstaller.py to build the executable 

Команда pyi-makespec создает spec-файл по умолчанию, содержащий все параметры, которые можно указать в командной строке. Файл simpleModel.spec создается в текущей директории.

Поскольку был использован параметр --onefile , то внутри файла будет только раздел exe.

. exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='simpleModel', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True )

Если использовать параметр по умолчанию или onedir, то вместе с exe-разделом будет также и раздел collect.

Можно открыть simpleModel.spec и добавить следующий текст для создания хуков.

# -*- mode: python ; coding: utf-8 -*- block_cipher = None import os spec_root = os.path.realpath(SPECPATH) options = [] from PyInstaller.utils.hooks import collect_submodules, collect_data_files tf_hidden_imports = collect_submodules('tensorflow_core') tf_datas = collect_data_files('tensorflow_core', subdir=None, include_py_files=True) a = Analysis(['simpleModel.py'], pathex=['E:\\myProject\\pyinstaller-tutorial'], binaries=[], datas=tf_datas + [], hiddenimports=tf_hidden_imports + [], hookspath=[], . 

Создаем хуки и добавляем их в hidden imports и раздел данных.

Хуки

Файлы хуков расширяют возможность PyInstaller обрабатывать такие требования, как необходимость включать дополнительные данные или импортировать динамические библиотеки.

Обычно пакеты Python используют нормальные методы для импорта своих зависимостей, но в отдельных случаях, как например TensorFlow, существует необходимость импорта динамических библиотек. PyInstaller не может найти все библиотеки, или же их может быть слишком много. В таком случае рекомендуется использовать вспомогательный инструмент для импорта из PyInstaller.utils.hooks и собрать все подмодули для библиотеки.

Скомпилируем модель после обновления файла simpleModel.spec.

pyinstaller simpleModel.spec 

Скопируем исполняемый файл на рабочий стол и увидим, что теперь он корректно отображает версию TensorFlow.

Вывод:

PyInstaller предлагает несколько вариантов создания простых и сложных исполняемых файлов из Python-скриптов:

  • Исполняемый файл может собрать в один бандл все требуемые данные с помощью параметра --add-data .
  • Исполняемый файл и зависимые данные с библиотеками можно собрать в один файл или папку с помощью --onefile или --onedir соответственно.
  • Динамические импорты и библиотеки второго уровня можно включить с помощью hidden-imports .
  • Файл spec позволяет создать исполняемый файл для обработки скрытых импортов и других файлов данных с помощью хуков.

Как скомпилировать проект на C# в один .exe файл?

Всем привет.
Я написал простое консольное приложение на C# , под Windows .
Есть задача скомпилировать небольшой проект в 1 .exe файл. То есть , скрыть файлы .dll , которые создаются после компиляции.
Большинство из "нагугливанного" не работает (статьи 2001-2012 годов). Считаю , что вопрос актуален.
Какими средствами вы пользуйтесь?

  • Вопрос задан более двух лет назад
  • 5137 просмотров

Комментировать
Решения вопроса 1

vabka

Василий Банников @vabka Куратор тега .NET
Токсичный шарпист

Single File Application - фича современных дотнетов со времён .net Core 3
Буквально при помощи одной опции в файле проекта или одной строкой в консоли собирает ваш проект в единый екзешник, в который ещё может быть опционально встроен рантайм.
Вот пример csproj:

  Exe net6.0 enable   true true win-x64 true true link  

В результате получается единственный exe, который реально можно запустить где угодно, вне зависимости от установленной версии .NET

Для старых версий дотнета есть ILMerge и Costura.Fody, но в .net 5+ они не нужны, и я крайне советую использовать именно .NET 8, тк он сейчас самый актуальный

Ответ написан более двух лет назад
Нравится 5 10 комментариев

rootovich1

Lizard @rootovich1 Автор вопроса

Попробую сегодня, скажу результат.
Второй день изучаю Cи - подобные языки , кле что остаётся непонятным.

vabka

Василий Банников @vabka Куратор тега .NET

Lizard, а ну и ещё важный момент забыл упомянуть.
Собирать финальную версию надо либо через консоль
dotnet publish
Либо в студии кнопка "опубликовать" (там выбрать публикацию в папку)

Adler_lug

 true

Ну это сильно по необходимости, т.к. размер конечного файла при этом заметно возрастает.
+ в независимости от установленного рантайма.
- в размере конечного файла.

vabka

Василий Банников @vabka Куратор тега .NET

Alexander, кстати, размер файла, в случае Hello World, увеличился всего до 14мб. По идее, если отключить R2R, то будет ещё меньше

Adler_lug

Василий Банников, ну для Linux программа на .Net 5 с несколькими библиотеками c ~2-3Мб без рантаймов вырастает до около 100 (если не больше) с рантаймами.

rootovich1

Lizard @rootovich1 Автор вопроса

613610be93f88600525238.png

Василий Банников,
Сделал по инструкции , все равно конечный фаил имеет dll и не запускается без них.

Мой код, который я пытаюсь упоковать в один файл:

using System.IO; using System.Security.Cryptography; using System.Linq; namespace _2test < class Program < static void Main(string[] args) < byte[] key = Enumerable.Range(0, 32).Select(x =>(byte)x).ToArray(); string PathToFolder = @"C:\Users\Lizard\Downloads\"; string[] allfiles = Directory.GetFiles(PathToFolder); foreach (string filename in allfiles) < EncryptFile(filename, key); >> private static void EncryptFile(string path, byte[] key) < string tmpPath = Path.GetTempFileName(); using (FileStream fsSrc = File.OpenRead(path)) using (AesManaged aes = new AesManaged() < Key = key >) using (FileStream fsDst = File.Create(tmpPath)) < fsDst.Write(aes.IV); using (CryptoStream cs = new CryptoStream(fsDst, aes.CreateEncryptor(), CryptoStreamMode.Write, true)) < fsSrc.CopyTo(cs); >> File.Delete(path); File.Move(tmpPath, path); > > >
  Exe net5.0 true win-x64 true true true link  

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *