Добавление файлов с данными и параметр onefile
Если задать параметр , то PyInstaller распаковывает все файлы в папку TEMP, выполняет скрипт и удаляет TEMP. Если вместе с add-data указать onefile, то нужно считать данные из папки. Путь папки меняется и похож на «_MEIxxxxxx-folder».
Копировать
Скрипт обновлен для чтения папки TEMP и файлов с данными. Создадим exe-файл с помощью onefile и add-data.
После успешного создания файл simple1.exe появится в папке DIST.
Можно скопировать исполняемый файл на рабочий стол и запустить, чтобы убедиться, что нет никакой ошибки, связанной с отсутствием файла.
Дополнительные импорты с помощью Hidden Imports
Исполняемому файлу требуются все импорты, которые нужны Python-скрипту. Иногда PyInstaller может пропустить динамические импорты или импорты второго уровня, возвращая ошибку …
Для решения этой ошибки нужно передать название недостающей библиотеки в hidden-import.
Например, чтобы добавить библиотеку os, нужно написать вот так:
Как Вручную Добавить Python В ПУТЬ Windows
Во-первых, если вы не установили Python на свой компьютер, перейдите на веб- сайт python.org, чтобы загрузить и установить предпочитаемую версию.
После успешной установки Python на ваш компьютер проверьте, не добавлен ли он в PATH Windows. Откройте свой терминал и введите python , затем нажмите клавишу Enter . Команда может вернуть ошибку, в которой говорится, что «python не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл», что означает, что Python еще не добавлен в переменную PATH вашего компьютера.
Чтобы запускать программы Python из командной строки, выполните шаги, выделенные ниже.
Найдите Путь Установки Python На Вашем ПК
Чтобы добавить Python в ваш Windows PATH, вам нужно получить путь его установки. Для этого откройте панель поиска Windows и введите python.exe (не нажимайте клавишу Enter ). Затем щелкните правой кнопкой мыши Python.exe, который появляется в появившемся меню, и выберите опцию Открыть расположение файла .
В открывшихся окнах проводника щелкните длинную панель каталогов слева от строки поиска. Выделите и скопируйте весь текст пути в буфер обмена с помощью Ctrl + c . Затем перейдите к следующим шагам ниже.
Далее: Добавить Python В PATH В Пользовательских Переменных
Чтобы добавить Python в PATH в пользовательских переменных , щелкните правой кнопкой мыши « Этот компьютер» и выберите « Свойства» . Оказавшись в меню свойств, нажмите на опцию Advanced system settings . В следующем окне выберите вкладку Advanced и выберите Environment Variables .
Environment Variables меню состоит из двух отдельных частей: верхняя часть называется Пользовательские переменные , а нижняя часть имени системных переменных . Однако в этом случае мы сосредоточимся на пользовательских переменных .
В меню пользовательских переменных найдите переменную с именем Path . Затем вставьте путь, который вы скопировали ранее, в параметр «Значение переменной», используя Ctrl + v, и нажмите « ОК» .
Однако, если вы не можете найти эту переменную, вам может потребоваться ее создать. Для этого нажмите New . Затем в форме имени переменной введите путь и вставьте свой путь Python в поле значения переменной .
Вернитесь в папку пути установки Python и дважды щелкните Scripts, чтобы открыть этот каталог. Затем скопируйте его путь из панели пути в верхней части окон (помимо панели поиска), как вы это делали ранее для пути установки Python.
Скопировав путь к скриптам, вернитесь к переменным среды . Затем выберите переменную Path и нажмите Edit . Введите точку с запятой после пути к исполняемому файлу Python и вставьте после него путь скриптов, который вы только что скопировали. Затем нажмите ОК .
Добавление Python В PATH С Помощью Параметра Системных Переменных
Вы также можете добавить Python в системную переменную PATH. Хотя это всего лишь альтернатива, и в ней нет необходимости, если вы уже добавили ее в переменные Users .
Чтобы использовать параметр « Системные переменные» , выполните шаги, выделенные выше, для копирования пути Python и его сценария. Затем вернитесь в переменные среды . Затем в сегменте системных переменных найдите переменную с именем Path . Щелкните эту переменную и щелкните Изменить .
В следующем появившемся окне нажмите New и вставьте путь, который вы скопировали ранее, в открывшееся пространство. Повторите этот процесс и для пути скриптов . Затем нажмите ОК и закройте окно переменных среды .
Всё вместе
Объединяя всё вместе, получаем
-Wall -Wextra -pedantic -std=c++11 -O2 -Wshadow -Wformat=2 -Wfloat-equal -Wconversion -Wlogical-op -Wshift-overflow=2 -Wduplicated-cond -Wcast-qual -Wcast-align -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC -D_FORTIFY_SOURCE=2 -fsanitize=address -fsanitize=undefined -fno-sanitize-recover -fstack-protector
Это всё (или по выбору) можно добавить к командной строке GCC на своём компьютере. Получается, что на своём компьютере мы запускаем отладочную версию с разными проверками, а на сервере — обычную. Естественно, что отладочная версия на своём компьютере будет работать медленнее обычной — больше всего влияют параметры (могут замедлить в два раза и более). Но это легко учесть, и это небольшая плата за поиск ошибок. В зависимости от версии компилятора и операционной системы не все эти параметры будут работать — их можно просто убрать из списка.
Надеюсь, этот пост поможет кому-то тратить меньше времени на отладку и больше времени на решение задач. Удачи всем
UPD1: С , для которой есть обходной путь.
UPD2: Обновлён список параметров:
- Добавлен (GCC 5+)
- Удалён (его заменяет )
- Удалён (его заменяет )
- Удалён (работает нестабильно и не является отладочным параметром)
UPD3: Добавлены и (GCC 6+).
Добавить Python В Windows PATH Автоматически
Вы также можете автоматически добавить Python в PATH Windows во время установки. Хотя этот метод работает не во всех случаях, вы все равно можете попробовать.
Для этого щелкните свой установочный файл и установите флажок « Добавить Python 3.7 в PATH» . Номер версии будет меняться при установке разных версий Python.
Установка этого флажка автоматически добавляет Python в ваш путь к Windows. Это означает, что вы можете запускать команды Python через командную строку сразу после установки.
Подтвердите, Что Python Добавлен В Windows PATH
Чтобы узнать, добавлен ли Python в PATH Windows, откройте терминал и введите python —version , затем нажмите клавишу Enter . Если команда возвращает текущую установленную версию Python, это означает, что вы успешно добавили ее в Windows PATH.
Однако, чтобы проверить, добавили ли вы каталог Scripts в Windows PATH, попробуйте запустить пакет установки pip на терминале, заменив «package» на предпочитаемую вами библиотеку. Если вы установили Python 2.7.9 и выше, команда устанавливает названный пакет, указывая, что вы также успешно добавили скрипты Python в путь.
Помимо добавления Python в PATH Windows, вы можете добавить текстовые редакторы, интегрированные среды разработки (IDE), Git, Node, Anaconda и многие другие программы.
Например, управлять проектом с помощью Sublime Text легко, когда вы открываете терминал в каталоге папки вашего проекта и запускаете subl. команда. Это откроет редактор в вашей текущей папке и отобразит его на боковой панели, еще один экономящий время ярлык для продуктивной работы с Sublime Text .
Не хватает нужных компонентов (компилятора, отладчика, библиотек)
Нужно понимать, что CodeBlocks — это просто каркас для подключения различных инструментов. Если вы просто скачаете пустой CodeBlocks с официального сайта и попытаетесь писать и отлаживать программу, то у вас ничего не получится. CodeBlocks не сможет запустить ни комплятор, ни отладчик. Все это нужно скачивать и устанавливать отдельно.
Но тут будет новая проблема — проблема выбора. CodeBlocks поддерживает все существующие компиляторы Си, какой выбрать? То же относится к любому другому инструментарию: отладчикам, профайлерам, плагинам и т.д.
Именно поэтому я и сделал сборку Си-экспресс, чтобы можно было сразу распаковать и работать. Все нужные компоненты уже установлены. Если вы точно знаете, что вам нужен другой компонент, то просто найдите и замените его на тот, который вам нужен.
Решение: Скачайте сборку Си-экспресс.
11 ответов
Лучший ответ
gcc (коллекция компиляторов GNU) предоставляет компилятор C. В Windows установите TDM-GCC. использует cgo. Cgo позволяет создавать пакеты Go, которые вызывают C-код.
67
peterSO
24 Апр 2017 в 13:09
В качестве других ответов приведены правильные объяснения, почему go build не работает для hyperledger в среде Windows. Для целей компиляции, просто чтобы заставить его работать без установки чего-либо дополнительного, вы можете попробовать следующее
Это сработало для меня. Надеюсь, у тебя тоже самое
3
Ashishkel
13 Июл 2017 в 04:28
На Ubuntu это очень просто, но на Windows это нужно сделать:
- загрузить MinGW на http://www.mingw.org/
- установить на базовый пакет Gcc-g ++ (см. это изображение)
- добавить в среду патч переменных Windows.
- перезапустите и продолжайте с «идти получить …»
1
greybeard
19 Мар 2020 в 03:08
Gcc не требуется, если только вы не выполняете кросс-компиляцию для платформы, отличной от Windows, или используете cgo. Однако, если вам все еще нужен gcc, вам следует установить MinGW, который предоставляет порт gcc для Windows (Cygwin и msys также должны работать, хотя я никогда не проверял это на самом деле).
Изменить: я вижу из вашего сообщения об ошибке сейчас, что это зависимость, которая требует gcc. Если вы еще этого не знали, gcc — это компилятор c / c ++, и в этом случае, вероятно, необходимо скомпилировать исходные файлы c, включенные зависимостью или суб-зависимостью.
oasf
8 Май 2017 в 22:57
Здравствуйте, jaswanth, основная проблема в том, что вы еще не зарегистрировали свой% GO_HOME% \ pkg \ tool \ windows_amd64 для своего Путь к среде. % GO_HOME% — это хранилище, в которое вы устанавливаете Go в первый раз.
kartamihardja
14 Апр 2018 в 06:21
- вам нужно скачать MingGW64
- поместите папку MingGW64 в вашу папку $ PATH
- запустить go build xxx.go (с библиотекой cgo)
paulg
15 Авг 2017 в 01:17
Вы можете попробовать — это не решение, а временное решение
После того, как вы установите gcc — и убедитесь, что у% PATH есть способ найти его (gcc.exe) — это должно исчезнуть.
Кроме того, выполнение этой команды гарантирует, что переменная cgo_enabled будет оставаться такой до тех пор, пока терминал открыт. Таким образом, вам не нужно добавлять префикс каждый раз, когда вы делаете сборку.
3
Alexey Shevelyov
8 Дек 2019 в 14:42
Если вы работаете в Ubuntu, сделайте:
Это решило проблему. Он устанавливает компиляторы и библиотеки gcc / g ++.
32
questionaire
8 Янв 2020 в 15:00
Пожалуйста, установите MINGW после того, как GUI автоматически примет.
1
premnikf7
6 Мар 2020 в 04:12
Как и другие, просто установите tdm-gcc, но вы можете использовать его терминал «MinGW», вы можете получить к нему доступ из папки меню Пуск tdm-gcc, после запуска перейдите к своему проекту и запустите его снова.
Tangerang Bebas
9 Янв 2020 в 10:22
В окне установите http://tdm-gcc.tdragon.net/download после его установки. необходимо перезагрузить компьютер. все это
4
Le Nguyen
21 Май 2019 в 03:24
Установка
Далее действуйте по инструкции
Двойной клик на mingw-17.1.exe
После установки нужно добавить C:\MinGW\bin в системную переменную среды PATH.
Если Вы не знаете как это сделать, прочитайте мою статью
«Системная переменная PATH»
Теперь команда gcc —version должна возвращать версию компилятора.
gcc —version
Microsoft Windows
(c) 2019 Microsoft Corporation. All rights reserved.
C:\Users\Andrei>gcc —version
gcc (GCC) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Если этого не происходит — перезапустите консоль. Если не помогло — перезапустите
Windows.
Создание exe файла с помощью PyInstaller
PyInstaller собирает в один пакет Python-приложение и все необходимые ему библиотеки следующим образом:
- Считывает файл скрипта.
- Анализирует код для выявления всех зависимостей, необходимых для работы.
- spec, который содержит название скрипта, библиотеки-зависимости, любые файлы, включая те параметры, которые были переданы в команду PyInstaller.
- Собирает копии всех библиотек и файлов вместе с активным интерпретатором Python.
- Создает папку BUILD в папке со скриптом и записывает логи вместе с рабочими файлами в BUILD.
- Создает папку DIST в папке со скриптом, если она еще не существует.
- Записывает все необходимые файлы вместе со скриптом или в одну папку, или в один исполняемый файл.
Если использовать параметр команды или при генерации исполняемого файла, тогда все будет помещено в одну папку. Это поведение по умолчанию. Если же использовать параметр или , то все окажется в одном исполняемом файле.
Возьмем в качестве примера простейший c названием simple.py, который содержит такой код.
Копировать
Создадим один исполняемый файл. В командной строке введите:
После завершения установки будет две папки, BUILD и DIST, а также новый файл с расширением .spec. Spec-файл будет называться так же, как и файл скрипта.
Python создает каталог распространения, который содержит основной исполняемый файл, а также все динамические библиотеки.
Вот что произойдет после запуска файла.
Файл spec
Файл spec — это первый файл, который PyInstaller создает, чтобы закодировать содержимое скрипта Python вместе с параметрами, переданными при запуске.
PyInstaller считывает содержимое файла для создания исполняемого файла, определяя все, что может понадобиться для него.
Файл с расширением .spec сохраняется по умолчанию в текущей директории.
Если у вас есть какое-либо из нижеперечисленных требований, то вы можете изменить файл спецификации:
- Собрать в один бандл с исполняемым файлы данных.
- Включить другие исполняемые файлы: .dll или .so.
- С помощью библиотек собрать в один бандл несколько программы.
Например, есть скрипт simpleModel.py, который использует TensorFlow и выводит номер версии этой библиотеки.
Копировать
Компилируем модель с помощью PyInstaller:
После успешной компиляции запускаем исполняемый файл, который возвращает следующую ошибку.
Исправим ее, обновив файл spec. Одно из решений — создать файл spec.
Команда pyi-makespec создает spec-файл по умолчанию, содержащий все параметры, которые можно указать в командной строке. Файл simpleModel.spec создается в текущей директории.
Поскольку был использован параметр , то внутри файла будет только раздел exe.
Если использовать параметр по умолчанию или onedir, то вместе с exe-разделом будет также и раздел collect.
Можно открыть simpleModel.spec и добавить следующий текст для создания хуков.
Создаем хуки и добавляем их в hidden imports и раздел данных.
Набор компиляторов GCC
Все программы представляют собой набор машинных команд, которые выполняются процессором. Эти команды — последовательность бит. Но писать программы наборами бит очень неудобно, поэтому были придуманы языки программирования высокого уровня. Код на языке программирования хорошо читаем и понятен для человека, а когда из него нужно сделать программу, компилятор ubuntu преобразует все в машинные команды.
В базовую поставку компилятора входят такие программы:
- libc6-dev — заголовочные файлы стандартной библиотеки Си;
- libstdc++6-dev — заголовочные файлы стандартной библиотеки С++;
- gcc — компилятор языка программирования Си;
- g++ — компилятор языка программирования C++;
- make — утилита для организации сборки нескольких файлов;
- dpkg-dev — инструменты сборки пакетов deb.
Все эти пакеты являются зависимостями пакета build-essential, поэтому для установки всего необходимого достаточно установить этот пакет.
Инструменты стандартной библиотеки
Кроме самого компилятора, есть ещё стандартная библиотека C/C++. Она тоже позволяет задать параметры, которые помогают при отладке программ.
-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC — эти параметры включают специальный отладочный режим стандартной библиотеки GNU C++. В этом режиме стандартные контейнеры и алгоритмы делают всевозможные проверки. Например, такой код:
в этом режиме выдаёт
/usr/include/c++/4.9.2/debug/vector:357:error: attempt to subscript container with out-of-bounds index 7, but container only holds 3 elements.
А такой код:
выдаёт
/usr/include/c++/4.9.2/bits/stl_algo.h:2267:error: elements in iterator range [__first, __last) are not partitioned by the value __val.
-D_FORTIFY_SOURCE=2 (только Linux/glibc) — этот параметр вставляет в программу разные проверки с уклоном в безопасность (переполнения буфера и т.д.). Например, с этим параметром такая программа:
выдаёт
*** buffer overflow detected ***: ./a.out terminated
Раздельная трансляция
Реальные программы сильно превышают размеры нашего первого примера ‘first.cpp’ по количеству строк кода. Когда оно увеличивается достаточно сильно, появляются проблемы:
- любое изменение в тексте файла с программой приводит к его полной перекомпиляции, что занимает ощутимое время;
- сложно организовать коллективную разработку (согласовать внесение изменений в один файл несколькими программистами);
- затрудняется навигация по созданному коду.
Начнём с простого случая, когда программа представляет из себя набор функций, и мы хотим вынести их часть в отдельный ‘.cpp’-файл. Возьмём уже использовавшийся пример с программой ‘first.cpp’ и добавим в неё вызов функции, определение которой помещается в файле ‘second.cpp‘:
// first.cpp #include <iostream> using std::endl; int f(); int main() { std::cout << "Здравствуй, Мир!" << endl << f() << endl; }
// second.cpp int f() {return 42;}
int f();#includemain
// first.cpp #include <iostream> #include "second.hpp" using std::endl; int main() { std::cout << "Здравствуй, Мир!" << endl << f() << endl; }
// second.hpp #ifndef SECOND_HPP #define SECOND_HPP int f(); #endif
// second.cpp int f() {return 42;}
#SECOND_HPP
Вернёмся от увлекательных особенностей C++ к использованию GCC. Оба указанных выше варианта компилируются и линкуются в один исполняемый файл одинаково, при помощи простого перечисления:
$ g++ ./first.cpp ./second.cpp -o hw42 $ ./hw42 Здравствуй, Мир! 42
$ g++ ./*.cpp -o hw42
Итак, мы сумели разнести код в несколько файлов, но пока еще не добились того, чтобы изменения в одном файле не приводили к перекомпиляции всех. Здесь снова придется вспомнить о том, что используемые до этого момента вызовы gcc (g++) приводят не только к компиляции, но и к линковке полученных после компиляции объектных фалов в один исполняемый файл. Нам потребуется явно разбить создание исполняемого файла на две стадии, используя ключ gcc -с, который просит оставить получившиеся объектные файлы на диске и не линковать их:
$ g++ ./*.cpp -c $ ls | grep '\.o$' first.o second.o
$ g++ ./*.o -o hw-from-o $ ./hw-from-o Здравствуй, Мир! 42
$ g++ ./second.cpp -c $ g++ ./*.o -o hw42-v.2
Предупреждения GCC
Конечно, первый шаг при ловле ошибок — это включить разные предупреждения компилятора. Уже одно это часто помогает. Как необходимый минимум можно назвать . Последний параметр нужен потому, что некоторые предупреждения включаются только вместе с оптимизацией. Далее я приведу ещё несколько полезных параметров, которые не включаются сами вместе с .
-pedantic — предупреждает об используемых нестандартных расширениях языка C++. Таким образом можно отсечь то, что может не поддерживаться на тестирующем сервере, и не тратить потом время на исправление кода. Лучше всего использовать вместе с -std=c++03 или -std=c++11. Например, -pedantic -std=c++03 выдаст предупреждение на
— правильно писать
-Wshadow — предупреждает, если имя объявленной переменной перекрывает такое же имя на более высоком уровне. Например, такой код вызовет предупреждение:
-
— предупреждает, если тип аргумента / не соответствует указанному в строке формата. Частично это уже включено с , но более строг.
-
— предупреждает, если два числа с плавающей точкой сравниваются так: . Обычно правильно сравнивать так: .
-
— предупреждает, если при неявном преобразовании типов могут потеряться данные.¹ Чаще всего это случайное присваивание значения в переменную типа . У меня это предупреждение включено с тех пор, как я завалил задачу, написав вместо :)¹ Явное преобразование (например, ) не вызовет предупреждения.
-
— предупреждает о подозрительном использовании логических операторов там, где GCC ожидал бы побитовые операторы.
-
— предупреждает о переполнении при операциях левого сдвига (GCC 6+).
-
— предупреждает, если условие в повторяется (GCC 6+).
Есть ещё и , но они бывают полезны реже (хоть и не мешают). Подробнее о предупреждениях GCC можно прочитать здесь: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Настройка ваших сборок ↑
У PyInstaller есть множество параметров, которые могут быть предоставлены в виде файлов спецификаций или обычных параметров интерфейса командной строки (CLI). Ниже вы найдете некоторые из наиболее распространенных и полезных настроек.
—name — изменить имя исполняемого файла
Это способ избежать того, чтобы ваши исполняемый файл, файл спецификации и папки артефактов сборки были названы в честь вашего сценария точки входа. —name полезно, если у вас есть привычка называть сценарий точки входа чем-то вроде cli.py, как это делаю я.
Вы можете создать исполняемый файл под названием realpython из cli.py скрипт с такой командой:
$ pyinstaller cli.py --name realpython
—onefile — упакуйте все приложение в один исполняемый файл
Параметры по умолчанию создают папку зависимостей и исполняемого файла, тогда как —onefile упрощает распространение, создавая только исполняемый файл.
Эта опция не требует аргументов. Чтобы объединить свой проект в один файл, вы можете выполнить сборку с помощью такой команды:
$ pyinstaller cli.py --onefile
С помощью приведенной выше команды ваша папка dist/ будет содержать только один исполняемый файл вместо папки со всеми зависимостями в отдельных файлах.
Это один из способов обойти ваш код, используя импорт внутри функций и . Вы также можете использовать —hidden-import несколько раз в одной команде.
Эта опция требует имени пакета, который вы хотите включить в свой исполняемый файл.. Например, если ваш проект импортировал библиотеку запросов внутри функции, PyInstaller не будет автоматически включать запросы в ваш исполняемый файл. Вы можете использовать следующую команду для принудительного включения запросов:
$ pyinstaller cli.py --hiddenimport=requests
Вы можете указать это несколько раз в своей команде сборки, по одному разу для каждого скрытого импорта.
—add-data и —add-binary — вставить в вашу сборку дополнительные данные или двоичные файлы.
Это полезно, если вы хотите объединить файлы конфигурации, примеры или другие данные, не связанные с кодом. Пример этого вы увидите позже, если будете следить за проектом чтения каналов.
—exclude-module — исключите некоторые модули из вашего исполняемого файла
Это полезно для исключения требований только для разработчиков, таких как среды тестирования. Это отличный способ сделать артефакт, который вы даете пользователям, как можно меньше. Например, если вы используете pytest, вы можете исключить это из своего исполняемого файла:
$ pyinstaller cli.py --exclude-module=pytest
Это полезно только в том случае, если вы создаете приложение с графическим интерфейсом. Это помогает скрыть детали реализации, позволяя пользователям никогда не видеть терминал.
Подобно опции —onefile, -w не принимает аргументов:
$ pyinstaller cli.py -w
.spec файл
Как упоминалось ранее, вы можете повторно использовать автоматически созданный файл .spec для дальнейшей настройки исполняемого файла. Файл .spec — это обычный скрипт Python, который неявно использует API библиотеки PyInstaller.
Поскольку это обычный скрипт Python, вы можете делать в нем практически все, что угодно. Вы можете обратиться к официальной документации файла спецификации PyInstaller для получения дополнительной информации об этом API.