Как скомпилировать python в exe файл в visual studio
Перейти к содержимому

Как скомпилировать python в exe файл в visual studio

  • автор:

Вопросы с меткой [exe]

Недавно начал изучение C++ и решил скомпилировать первую программу, обычный Hello world. Ради интереса закинул этот exe на VirusTotal, он пишет, что обнаружено 8 угроз. Также Windows defender удаляет .

задан 14 янв в 14:15

Компиляция в exe файл

пытаюсь скомпилировать файл .py, созданный в VS, в exe-файл, но никак не получается. При попытке вызова auto-py-to-exe, или pyinstaller, пишет: «auto-py-to-exe» не является внутренней или .

задан 5 дек 2023 в 15:58
15 показов

Windows dotNet application security

They sent me a file with a .rar extension and I extracted it and launched the application there, it started but when I wanted to click on View images the following error appeared

задан 4 дек 2023 в 16:57
67 показов

При компиляции .py в .exe 32-bit на 64-bit системе я могу его запустить на windows 10 64-bit, а на windows 7 32-bit не могу, почему?

Есть скрипт .py который я скомпилировал на 3.12 32-bit версии питона при помощи библиотеки auto-py-to-exe, для windows 7 32-bit. У меня стоит 64-bit система и 32-bit .exe-шник у меня запускается, а на .

задан 27 ноя 2023 в 13:08

После преобразование в exe файл программа не открывается

Писал программу в PyCharm, интерфейс с использованием PyQt. В виде py-файла программа работает, по после перевода в exe с помощью ‘pyinstaller —onefile —noconsole main.py’, выдаёт такую ошибку при .

задан 14 ноя 2023 в 4:07

Как объединить два exe файла в один?

У меня есть два файла, один файл — script, который записывает определенные данные в файл log.txt, а также есть второй файл — bot, который берет информацию из файла log.txt и присылает в чат, как .

задан 10 ноя 2023 в 11:06
37 показов

К добавить цвета в exe в auto-py-to-exe?

Часть кода: \033[1;34mOS:\033[0m \033[1;33m< os_name>\033[0 Это «\033[1;34\033[0m» отвечает за цвет, в консоли Vs кода цвета отображаются, а при конвертировании в exe в cmd цвета не .

задан 2 ноя 2023 в 15:44

Ошибка «Prefix creation exited with error: You find a logfile to help with debugging on your desktop» при запуске .exe файл на macOS с помощью Wine

При попытке запустить .exe файл на macOS с помощью Wine возникает такая ошибка. Кто знает, как ее устранить? Log ошибки: ###BOTTLING### customprefix.sh /Applications/Wine.app/Contents/Frameworks/.

задан 5 сен 2023 в 19:50
145 показов

как из exe сделать python если exe файл сделан с помощью pyinstaller?

Есть файл но нужно посмотреть код можно ли обратно превратить exe в py?
задан 13 авг 2023 в 16:20

Как уменьшить размер python файла при компилированиии через PyInstaller?

У меня есть простой код IP-grabber’а (не подумайте ничего плохого), всего в 21(!!) строчку. Скомпилировав его через PyInstaller используя только параметр —onefile у меня вышло.. 18 мб ярости. Как .

задан 9 авг 2023 в 19:26
275 показов

Как поставить иконку для exe файла на Python чтобы файл можно было открыть на всех пк

Пытался поставить иконку для приложения на Python пишу программу на CustomTkinter app.iconbitmap(r’D:\Explore\logo.ico’)И в pyinstaller pyinstaller —onefile —icon=logo.ico -w main.py на моем пк оно .

задан 8 авг 2023 в 18:55
47 показов

Можно ли как-то собрать Electron.js приложение в 1 исполняемый файл

В шапке вопрос, спасибо за ответ
задан 27 июл 2023 в 13:44
57 показов

Преоброзование Python-кода в исполняемый файл внутри python программы

Как реализовать интерпретирование кода в виде строки в exe файл в Python-скрипте. То есть: Пользователь открывает Python-файл. Внутри файла содержится строка. Python программа преобразует ту строку .

задан 16 июл 2023 в 23:20

Проблема с открытие exe файла после создание через pyinstaller

Помогите, пожалуйста, разобраться. Сформировал exe файл на pyinstaller, но при его открытии вылетает ошибка: FileNotFoundError: [Errno 2] No such file or directory: ‘C:\\Users\\90C5~1\\AppData\\Local\\.

задан 16 июл 2023 в 6:46
39 показов

Права администратора для приложения

мне нужно чтобы при запуске программы запрашивались права администратора у пользователя. Как это сделать?Приложение написано на Python и скомпилировано в exe

Как скомпилировать файл *.py в *.exe

Author24 — интернет-сервис помощи студентам

Как скомпилировать свой файл в exe?
Всем привет! Только начал изучать Питона. В консоли всё окей отображается, но как вынести всю.

Как скомпилировать python в файл .exe на Linux с pyinstaller?
Доброе время суток всем прогерам. Мне нужна помощь. Ситуация такая. Недавно начал изучать python.

Как скомпилировать код в exe-файл?
Есть код, уже который раз пытаюсь сделать из него исполняемый файл на Windows, пробовал.

Как py файл скомпилировать в exe файл?
Здравствуйте! Мне необходимо скомпилировать файл python в exe. Через pyinstaller main.py выходит.

Эксперт Python

5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от tabbols95 Посмотреть сообщение

Может как-то по другому скомпилировать?

1) Python не компилируется в exe (реально не в курсе? это же скриптовый язык, а скрипты не компилируются никуда кроме байткода).
2) читайте справку по pyinstaller — там 150000 разных настроек, которые почему-то никто не читает. Файлы spec как раз дают возможность полностью кастомизировать процесс упаковки скрипта+интерпретатор+библиотеки в архив.

Просто Лис

Эксперт Python

5347 / 3359 / 1023
Регистрация: 17.05.2012
Сообщений: 9,835
Записей в блоге: 9

Наверняка же есть portable-сборки питона. Положите питоновские скрипты рядом и напишите батник/шеловский скрипт для запуска интерпретатора.

Регистрация: 30.05.2019
Сообщений: 10

Я использую для компиляции в exe — pyinstaller (pip install pyinstaller)

в консоли пишем «pyinstaller -F scrit_name.py» без кавычек
что бы прога не закрывалась сразу, добавь в самом конце input()
на другие пк попробуй поставить ms c++ redistributable 2015 — мне помогло

Эксперт Python

5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от ortaxx Посмотреть сообщение

Я использую для компиляции в exe

Для тех кто в «танке» или в умственной коме — Python не компилируется exe. Посты выше попробуй осмыслить внимательно, прежде чем постить.

Регистрация: 21.06.2019
Сообщений: 16

tabbols95,
Я сам новичок, смотрю на то, как опытные (судя по их сообщениям и оценкам) говорят о том, что скопилить в .ехе нельзя. Решил проверить, действительно ли это так. Интернет говорит о том, что такие способы существуют. Зашел на популярный видеохостинговый сайт и собственно вбил запрос в поиск. Видосов море..

Эксперт Python

5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

specte
И опять для тех кто в танке — все видосы про pyinstaller и CX_Freeze. При этом авторы видосов всегда забывают (или просто не знают, так как нубы и школяры) сказать, что все что делают эти библиотеки это никакая не компиляция, а упаковка в архив. Расширение .exe ничего не меняет. Winrar тоже умеет создавать самораспаковывающийся архив. И что? Это тоже компиляция?
Неужели так трудно загуглить и узнать значение слова «компиляция»? Потом загуглить Python VM и узнать про компиляцию в байткод, что не имеет отношения к компиляции в нативный машинный код.

Регистрация: 21.06.2019
Сообщений: 16

Garry Galler, Полагаю, что когда тс задавал свой вопрос он имел ввиду наверное то, что вы называете упаковку в архив.ехе, я пока далек от этого и мне пока это не требуется, гуглить не буду, но от вас с радостью узнаю, что такое компиляция, вы ведь здесь, чтобы помочь или подметить, что кто то в танке или в умственной коме, вам нравится так выражаться и считать себя лучше нас — новичков?

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как скомпилировать приложение в exe-файл
Всем привет Создал программу в Visual Studio Express 2012 но не знаю теперь как ее сохранить в exe.

Как скомпилировать единый exe файл?
Как скомпилировать единый exe файл в проекте Visual Studio? 2022

Как скомпилировать проект в exe файл?
Как скомпилировать проект в visual studio в exe

Как скомпилировать C# проект в .exe файл?
Как скомпилировать C# проект в .exe файл? И взять, скопировать и запустить на любом компьютере без.

Как скомпилировать программу в один exe файл
Здравствуйте, скажите я новичек в VB нужно что-бы программа скомпилировалась в один запускаемый.

Как скомпилировать два проекта в 1 exe файл
У меня такая проблема. Моя программа состоит из 2 проектов. После компиляции у меня создаются 2 exe.

Как скомпилировать проект Дельфи в exe файл?
Всем привет! Как скомпилировать проект в делфи в 1 .exe файл?

Или воспользуйтесь поиском по форуму:

Проекты Python в Visual Studio

Приложения Python обычно определяются только с помощью файлов и папок, но такая структура может усложнить работу, так как приложения увеличиваются в размере и могут содержать автоматически сгенерированные файлы, JavaScript для веб-приложений и т. д. Проект Visual Studio помогает управлять этими сложными моментами. Проект (файл .pyproj) определяет все исходные файлы и файлы содержимого, связанные с проектом, содержит сведения о сборке каждого файла, хранит информацию для интеграции с системами управления версиями и помогает упорядочить приложение в виде логических компонентов.

Python project in Solution Explorer

Кроме того, проекты всегда управляются в решении Visual Studio, которое может содержать любое число проектов с возможностью ссылаться друг на друга. Например, проект Python может ссылаться на проект C++, который реализует модуль расширения. Благодаря этой связи Visual Studio автоматически создает проект C++ (при необходимости), когда вы запускаете отладку проекта Python. (Общие сведения см. в статье Решения и проекты в Visual Studio.)

Visual Studio предоставляет множество шаблонов проектов Python, позволяющих быстро настроить несколько структур приложений, а также шаблон для создания проекта из существующего дерева папок и шаблон для создания пустого проекта. Список шаблонов см. в разделе Шаблоны проектов.

В Visual Studio 2019 можно открыть папку с кодом Python и выполнить этот код, не создавая проект Visual Studio и файлы решения. Дополнительные сведения см . в кратком руководстве. Открытие и запуск кода Python в папке. Но файл проекта имеет ряд важных преимуществ, которые мы описали в этой статье.

Все версии Visual Studio нормально работают с кодом Python даже без проекта. Например, можно открыть сам файл Python и выполнить автозавершение и отладку, а также использовать функцию IntellSense. Для этого щелкните правой кнопкой мыши в редакторе и выберите пункт Запуск с отладкой. Такой код всегда использует глобальное окружение по умолчанию, однако при работе могут возникать неверные завершения или ошибки, если код предназначен для другого окружения. Кроме того, Visual Studio анализирует все файлы и пакеты в папке, из которой открыт один файл, что может значительно расходовать время ЦП.

Проект Visual Studio можно создать из существующего кода, как описано в разделе Создание проекта из существующих файлов.

Добавление файлов, назначение файла запуска и настройка сред

При разработке приложения обычно требуется добавить в проект новые файлы различных типов. Чтобы это сделать, щелкните правой кнопкой мыши проект, выберите Добавить>Существующий элемент и перейдите к нужному файлу. Можно также выбрать Добавить>Новый элемент. Появится диалоговое окно с различными шаблонами элементов. Как описано в справочнике по шаблонам элементов, доступны такие варианты: пустые файлы Python, класс Python, модульный тест и различные файлы, связанные с веб-приложениями. Вы можете испробовать эти варианты с помощью тестового проекта, чтобы узнать о возможностях вашей версии Visual Studio.

Каждый проект Python имеет один назначенный файл запуска, выделенный полужирным шрифтом в обозревателе решений. Это файл, который запускается, когда вы запускаете отладку (F5 или Отладка>Начать отладку) или выполняете проект в интерактивном окне (SHIFT+ALTF+5 или Отладка>Выполнить проект в интерактивном окне Python). Чтобы изменить его, щелкните правой кнопкой мыши новый файл и выберите действие Назначить автозапускаемым элементом (или Задать как файл запуска в ранних версиях Visual Studio).

Если удалить выбранный файл запуска из проекта и не выбрать новый, Visual Studio не будет знать, с какого файла Python нужно начинать выполнение проекта. В этом случае в Visual Studio 2017 версии 15.6 и более поздних версий возникает ошибка. В более ранних версиях либо открывается окно вывода с запущенным интерпретатором Python, либо окно вывода появляется, но почти сразу же исчезает. Если у вас возникла подобная ситуация, убедитесь, что назначен файл запуска.

Чтобы окно вывода оставалось открытым, щелкните правой кнопкой мыши проект, выберите Свойства, откройте вкладку Отладка, а затем добавьте -i в поле Аргументы интерпретатора. Этот аргумент вынуждает интерпретатор перейти в интерактивный режим после завершения программы, оставив окно открытым, пока вы не нажмете клавиши CTRL+Z>ВВОД для выхода.

Новый проект всегда по умолчанию связан с глобальной средой Python. Чтобы связать проект с другим окружением (в том числе виртуальным), в проекте щелкните правой кнопкой мыши узел Окружения Python и выберите команду Добавить окружение. , а затем выберите нужные окружения. Можно также использовать элемент управления с раскрывающимся списком окружений на панели инструментов, чтобы выбрать окружение или добавить в проект новое.

Add Environment command on the Python toolbar

Чтобы изменить активное окружение, в обозревателе решений щелкните правой кнопкой мыши нужное окружение и выберите действие Активировать окружение. Дополнительные сведения см. в разделе о выборе окружения для проекта.

Activating an environment for a Python project

Шаблоны проектов

Visual Studio предоставляет несколько способов настройки проекта Python — с нуля или из существующего кода. Чтобы использовать шаблон, выберите команду меню Файл>Создать>Проект или щелкните правой кнопкой мыши решение в обозревателе решений и выберите Добавить>Новый проект. В любом случае отобразится диалоговое окно Новый проект. Чтобы просмотреть шаблоны, относящиеся к Python, выполните поиск по «Python» или выберите узел Python языка>:

New project dialog with Python templates

В следующей таблице перечислены шаблоны, доступные в Visual Studio 2022:

Template Description
На основе существующего кода Python Создает проект Visual Studio из существующего кода Python в структуре папок.
Приложение Python Структура базового проекта для нового приложения Python с одним пустым исходным файлом. По умолчанию проект выполняется в консоли интерпретатора глобальной среды по умолчанию, которую можно изменить, назначив другую среду.
Веб-проекты Проекты для веб-приложений на базе различных платформ, включая Bottle, Django и Flask.
Фоновое приложение (Интернет вещей) Поддерживает развертывание проектов Python для работы в качестве фоновых служб на устройствах. Дополнительные сведения см. на странице центра разработчиков Интернета вещей Windows.
Модуль расширения Python Этот шаблон отображается в области Visual C++, если вы уже установили Собственные средства разработки Python с рабочей нагрузкой Python в Visual Studio 2017 или более поздней версии (см. раздел Установка). Он предоставляет базовую структуру для библиотеки DLL расширения C++, как описано в статье Создание расширения C++ для Python.

В следующей таблице перечислены шаблоны, доступные в Visual Studio 2019 (не все шаблоны доступны в предыдущих версиях).

Template Description
На основе существующего кода Python Создает проект Visual Studio из существующего кода Python в структуре папок.
Приложение Python Структура базового проекта для нового приложения Python с одним пустым исходным файлом. По умолчанию проект выполняется в консоли интерпретатора глобальной среды по умолчанию, которую можно изменить, назначив другую среду.
Веб-проекты Проекты для веб-приложений на базе различных платформ, включая Bottle, Django и Flask.
Приложение с IronPython Аналогичен шаблону приложения Python, но по умолчанию использует интерпретатор IronPython, поддерживающий взаимодействие .NET и смешанный режим отладки с использованием языков .NET.
Приложение WPF с IronPython Структура проекта, использующая IronPython с XAML-файлами Windows Presentation Foundation для пользовательского интерфейса приложения. Visual Studio предоставляет конструктор пользовательского интерфейса XAML, возможность написания кода программной части на Python, а также возможность запуска приложения без отображения консоли.
Веб-страница с IronPython и Silverlight Это проект IronPython, который выполняется в браузере с подключаемым модулем Silverlight. Код приложения Python добавляется на веб-страницу в виде скрипта. Стандартный тег скрипта получает часть кода JavaScript, который инициализирует IronPython, выполняющийся в Silverlight, откуда код Python может взаимодействовать с моделью DOM.
Приложение Windows Forms с IronPython Структура проекта, использующая IronPython с пользовательским интерфейсом, созданным с помощью кода и Windows Forms. Приложение запускается без вывода консоли.
Фоновое приложение (Интернет вещей) Поддерживает развертывание проектов Python для работы в качестве фоновых служб на устройствах. Дополнительные сведения см. на странице центра разработчиков Интернета вещей Windows.
Модуль расширения Python Этот шаблон отображается в области Visual C++, если вы уже установили Собственные средства разработки Python с рабочей нагрузкой Python в Visual Studio 2017 или более поздней версии (см. раздел Установка). Он предоставляет базовую структуру для библиотеки DLL расширения C++, как описано в статье Создание расширения C++ для Python.

Так как Python является интерпретируемым языком, проекты Python в Visual Studio не создают отдельный исполняемый файл, как это делают проекты, написанные на других компилируемых языках программирования (например, C#). Дополнительные сведения см. в разделе вопросов и ответов.

Создание проекта на основе имеющихся файлов

Описанный здесь процесс не перемещает и не копирует исходные файлы. Если вы хотите работать с копией, сначала создайте дубликат папки.

Screenshot of a New Project creation from Existing Code window, step 1.

  1. Запустите Visual Studio и выберите Файл>Создать>Проект.
  2. В диалоговом окне Создание проекта выполните поиск по запросу «Python», выберите шаблон На основе существующего кода Python, укажите имя и расположение проекта, а затем нажмите кнопку ОК.
  3. В появившемся мастере задайте путь к существующему коду, фильтр для типов файлов и любые пути поиска, необходимые для проекта, а затем нажмите кнопку Далее. Если вы не знаете пути поиска, оставьте это поле пустым.
  4. В следующем диалоговом окне выберите файл запуска для проекта и нажмите кнопку Далее. При необходимости выберите среду; в противном случае оставьте значения по умолчанию.

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

Screenshot of New Project Creation from Existing Code window, step 2.

  • Выберите место, где следует сохранить файл проекта (файл .pyproj на диске). При необходимости можно также включить автоматическое обнаружение виртуальных сред и настроить проект для разных веб-платформ. Если вы не уверены, оставьте для этих параметров значения по умолчанию. Screenshot of a New Project creation from Existing Code window, step 3.
  • Нажмите кнопку Готово. Visual Studio создаст проект и откроет его в обозревателе решений. Если вы хотите переместить файл .pyproj в другое место, выберите его в Обозревателе решений и щелкните Файл>Сохранить как. Это действие обновляет ссылки на файлы в проекте, но не перемещает файлы с кодом.
  • Чтобы указать другой файл запуска, найдите его в Обозревателе решений, щелкните его правой кнопкой мыши и выберите Задать как файл запуска.
  • Связанные файлы

    Linked file icon

    Связанные файлы — это файлы, которые добавлены в проект, но при этом находятся за пределами папок проекта приложения. Они отображаются в Обозреватель решений как обычные файлы со значком ярлыка:

    Связанные файлы указаны в файле PYPROJ с помощью элемента . Связанные файлы могут быть неявными, если они используют относительный путь за пределами структуры каталогов, или явными, если они используют пути в обозревателе решений:

     MyProject\test2.py  

    Связанные файлы игнорируются при выполнении любого из следующих условий:

    • Связанный файл содержит метаданные связи, и путь, указанный в атрибуте Include, находится в пределах каталога проекта.
    • Связанный файл дублирует файл, который существует в иерархии проекта.
    • Связанный файл содержит метаданные связи, и путь является относительным путем вне иерархии проекта.
    • Путь связи является корневым.

    Работа со связанными файлами

    Чтобы добавить существующий элемент в качестве связи, щелкните правой кнопкой мыши папку проекта, в которую вы хотите добавить файл, а затем выберите Добавить>Существующий элемент. В открывшемся диалоговом окне выберите файл и щелкните Добавить как связь в раскрывающемся списке кнопки Добавить. Если конфликтующие файлы отсутствуют, эта команда создает связь в выбранной папке. Связь не добавится, если файл с таким именем уже существует или связь с этим файлом уже существует в проекте.

    При попытке создать связь с файлом, который уже существует в папке проекта, он добавляется как обычный файл, а не как связанный. Чтобы преобразовать файл в связь, выберите Файл>Сохранить как и сохраните файл в расположение вне иерархии проекта. Visual Studio автоматически преобразует его в связь. Аналогичным образом можно преобразовать связь обратно с помощью команды Файл>Сохранить как и сохранить файл в иерархии проекта.

    При перемещении связанного файла в обозревателе решений связь также перемещается, но фактический файл при этом не затрагивается. Аналогичным образом, удаление связи приведет к удалению только связи, не затрагивая сам файл.

    Связанные файлы нельзя переименовать.

    Ссылки

    Проекты Visual Studio поддерживают добавление ссылок на проекты и расширения, которые отображаются в узле Ссылки в обозревателе решений.

    Extension references in Python projects

    Ссылки на расширения обычно указывают зависимости между проектами и используются для обеспечения IntelliSense во время разработки или связывания во время компиляции. Проекты Python используют ссылки подобным образом, но из-за динамической природы Python они в основном используются во время разработки для предоставления усовершенствованной функции IntelliSense. Они также могут использоваться для развертывания в Microsoft Azure с целью установки дополнительных зависимостей.

    Модули расширений

    Ссылка на файл PYD позволяет использовать IntelliSense для созданного модуля. Visual Studio загружает файл PYD в интерпретатор Python и анализирует его типы и функции. Программа также пытается выполнить синтаксический анализ строк функций в документе, чтобы предоставить справку по сигнатурам.

    Если в любой момент модуль расширения обновляется на диске, Visual Studio повторно анализирует модуль в фоновом режиме. Это не влияет на поведение во время выполнения, но некоторые варианты завершения остаются недоступными до завершения анализа.

    Необходимо добавить путь поиска к папке, содержащей модуль.

    Проекты .NET

    При работе с IronPython можно добавить ссылки на сборки .NET, чтобы активировать использование IntelliSense. Для проектов .NET в решении щелкните правой кнопкой мыши узел Ссылки в проекте Python, выберите Добавить ссылку, щелкните вкладку Проекты и найдите нужный проект. Для библиотек DLL, которые вы скачали отдельно, выберите вкладку Обзор и перейдите к требуемой библиотеке DLL.

    Так как ссылки в IronPython недоступны до вызова clr.AddReference(») , в сборку также нужно добавить соответствующий вызов clr.AddReference . Обычно он добавляется в начале кода. Например, код, созданный шаблоном проекта IronPython Windows Forms (доступно в Visual Studio 2019) в Visual Studio, включает два вызова в верхней части файла:

    import clr clr.AddReference('System.Drawing') clr.AddReference('System.Windows.Forms') from System.Drawing import * from System.Windows.Forms import * # Other code omitted 

    Проекты WebPI

    Можно добавить ссылки на записи продукта WebPI для развертывания в облачных службах Microsoft Azure, где можно установить дополнительные компоненты с помощью веб-канала WebPI. По умолчанию отображаемый веб-канал предназначен только для Python и содержит Django, CPython и другие основные компоненты. Также можно выбрать собственный веб-канал, как показано ниже. При публикации в Microsoft Azure задача установки устанавливает все продукты, на которые имеются ссылки.

    Проекты WebPI недоступны в Visual Studio 2017 или Visual Studio 2019.

    Создание расширения C++ для Python

    Модули, написанные на C++ (или C), обычно используются для расширения возможностей интерпретатора Python. Они также обеспечивают доступ к низкоуровневым возможностям операционной системы.

    Модули можно разделить на три следующих основных типа.

    • Модули ускорения. Так как Python является интерпретируемым языком, вы можете писать модули ускорителя на C++ для повышения производительности.
    • Модули-оболочки. Эти модули открывают существующие интерфейсы C/C++ для кода Python или предоставляют адаптированный API, который удобно использовать в Python.
    • Модули низкоуровневого системного доступа. Эти модули создаются для доступа к низкоуровневым функциям среды выполнения CPython , операционной системы или базового оборудования.

    В этой статье рассматривается создание модуля расширения C++ для CPython , который вычисляет гиперболический тангенс и вызывает его из кода Python. Подпрограмма реализована сначала на языке Python, чтобы продемонстрировать относительный прирост производительности по сравнению с реализацией той же подпрограммы на C++.

    В этой статье также показаны два способа сделать расширение C++ доступным в Python:

    • использование стандартных расширений CPython , как описано в документации по Python;
    • использование PyBind11 (рекомендуется для C++ 11 благодаря его простоте). Для обеспечения совместимости используйте какую-то из более актуальных версий Python.

    Полный пример из этого руководства см. на GitHub по ссылке python-samples-vs-cpp-extension.

    Необходимые компоненты

    Screenshot of a list of Python development options, highlighting the Python native development tools option.

    • Visual Studio 2017 или более поздней версии с установленной рабочей нагрузкой разработки на Python. Эта рабочая нагрузка включает встроенные средства разработки Python, которые подключают рабочую нагрузку C++ и наборы инструментов, необходимые для собственных расширений.

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

    Дополнительные сведения о параметрах установки см. в разделе Установка поддержки Python в Visual Studio. Если вы устанавливаете Python отдельно, обязательно выберите параметр Скачать отладочные символы в разделе Дополнительные параметры установщика. Этот параметр необходим, чтобы вы могли использовать отладку в смешанном режиме между кодом Python и машинным кодом.

    Создание приложения Python

    1. Создайте проект Python в Visual Studio, выбрав Файл>Создать>Проект.
    2. Выполните поиск по ключевому слову Python, выберите шаблон Приложение Python, задайте имя и расположение, а затем нажмите кнопку OK.
    3. В файл проекта с расширением .py вставьте следующий код. Чтобы испытать некоторые функции редактирования Python, попробуйте ввести этот код вручную. Этот код вычислит гиперболический тангенс без использования математической библиотеки, что позволит вам ускорить работу встроенных расширений.

    Совет Сначала напишите код только на Python, а затем перепишите его на C++. Таким образом вам будет проще проверить правильность машинного кода.

    from random import random from time import perf_counter COUNT = 500000 # Change this value depending on the speed of your computer DATA = [(random() - 0.5) * 3 for _ in range(COUNT)] e = 2.7182818284590452353602874713527 def sinh(x): return (1 - (e ** (-2 * x))) / (2 * (e ** -x)) def cosh(x): return (1 + (e ** (-2 * x))) / (2 * (e ** -x)) def tanh(x): tanh_x = sinh(x) / cosh(x) return tanh_x def test(fn, name): start = perf_counter() result = fn(DATA) duration = perf_counter() - start print('<> took seconds\n\n'.format(name, duration)) for d in result: assert -1 '.format(COUNT)) test(lambda d: [tanh(x) for x in d], '[tanh(x) for x in d] (Python implementation)') 

    Совет При запуске тестов производительности всегда выбирайте в меню Отладка>Запуск без отладки. Это помогает избежать дополнительных временных затрат, возникающих при запуске кода в отладчике Visual Studio.

    Создание основных проектов C++

    Следуйте инструкциям в этом разделе, чтобы создать два идентичных проекта C++ с именами superfastcode и superfastcode2. Позднее вы будете использовать в этих проектах разные способы предоставления кода C++ в Python.

    1. В обозревателе решений щелкните решение правой кнопкой мыши и последовательно выберите пункты Добавить>Новый проект. Решение Visual Studio может одновременно содержать проекты Python и C++ — это одно из преимуществ использования Visual Studio для Python.
    2. Выполните поиск C++, выберите Пустой проект, укажите либо superfastcode для первого проекта, либо superfastcode2 для второго проекта, а затем нажмите кнопку OK.

    Совет Или, если вы установили собственные средства разработки Python в Visual Studio, можете начать с шаблона «Модуль расширения Python». В этом шаблоне уже имеется большая часть описанных здесь возможностей. Но в этом пошаговом руководстве начало работы с пустого проекта позволяет шаг за шагом продемонстрировать создание модуля расширения. Ознакомившись с процессом, в дальнейшем вы сможете использовать этот шаблон для экономии времени при написании собственных расширений.

    Важно! Файл с расширением .cpp нужен, чтобы активировать страницы свойств C++ в последующих шагах.

    • Для 64-разрядной среды выполнения Python активируйте конфигурацию x64.
    • Для 32-разрядной среды выполнения Python следует активировать конфигурацию Win32.

    Примечание. При создании собственных проектов вам понадобится настроить конфигурации и отладки, и выпуска. В этом уроке вы настроите только конфигурацию отладки и установите в ней использование сборки выпуска CPython. Эта конфигурация отключает некоторые функции отладки среды выполнения C++, в том числе утверждения. Для использования двоичных файлов отладки CPython (python_d.exe) требуются другие параметры.

    TAB Свойство Значение
    Общие сведения Имя цели Укажите имя модуля, которое будет использоваться для ссылки на этот модуль из Python в инструкциях from. import . Это же имя будет использоваться в C++ при определении модуля для Python. Чтобы применить имя проекта в качестве имени модуля, сохраните значение по умолчанию $ . Для python_d.exe добавьте _d в конец файла.
    Дополнительно>Расширение целевого файла .pyd
    Проект по умолчанию>Тип конфигурации Динамическая библиотека (.dll)
    C/C++>Общие Дополнительные каталоги включаемых файлов Добавьте подходящую для вашей установки папку include Python (например, c:\Python36\include ).
    C/C++>Препроцессор Определения препроцессора При наличии этого свойства измените значение _DEBUG на NDEBUG для соответствия неотладочной версии CPython. Если вы используете python_d.exe, оставьте это значение без изменений.
    C/C++>Создание кода Библиотека времени выполнения Выберите Многопоточная DLL (/MD) для соответствия не отладочной версии CPython. Если вы используете python_d.exe, оставьте значение Многопоточная DLL для отладки (/MDd).
    Базовые проверки среды выполнения По умолчанию
    Компоновщик>Общие Дополнительные каталоги библиотек Добавьте подходящую для вашей установки папку Python libs с файлами .lib (например c:\Python36\libs). Убедитесь, что указали папку libs, содержащую файлы .lib, но не папку Lib, содержащую файлы .py.

    Примечание. Если вы не видите вкладку C/C++ в свойствах проекта, значит, в проекте нет файлов, определенных как исходные файлы C/C++. Такая ситуация может возникнуть, если вы создали исходный файл без расширения .c или .cpp. Например, если в диалоговом окне создания элемента вы случайно введете module.coo вместо module.cpp, Visual Studio создаст файл, но не задаст для него тип Код C/C, что требуется для активации вкладки свойств C/C++. Такая неправильная идентификация сохранится, даже если вы переименуете файл и добавите расширение .cpp. Чтобы установить правильный тип файла, в Обозревателе решений щелкните файл правой кнопкой мыши и выберите пункт Свойства. Затем в качестве типа файлавыберите Код C/C++.

    #include #include const double e = 2.7182818284590452353602874713527; double sinh_impl(double x) < return (1 - pow(e, (-2 * x))) / (2 * pow(e, -x)); >double cosh_impl(double x) < return (1 + pow(e, (-2 * x))) / (2 * pow(e, -x)); >double tanh_impl(double x) < return sinh_impl(x) / cosh_impl(x); >

    Преобразование проекта C++ в расширения для Python

    Чтобы преобразовать DLL-библиотеку C++ в расширение для Python, сначала нужно изменить экспортируемые методы для взаимодействия с типами Python. После этого добавьте функцию, экспортирующую модуль, а также определения методов модуля.

    В последующих разделах объясняется, как выполнить эти действия с помощью расширений CPython и PyBind11.

    Использование расширений CPython

    Дополнительные сведения о коде, приведенном в этом разделе, см. в справочном руководстве по API Python/C, в частности на странице Объекты модуля. Не забудьте выбрать версию Python в раскрывающемся списке в правом верхнем углу.

      В верхней части файла module.cpp включите Python.h.

    #include
    PyObject* tanh_impl(PyObject* /* unused module reference */, PyObject* o) < double x = PyFloat_AsDouble(o); double tanh_x = sinh_impl(x) / cosh_impl(x); return PyFloat_FromDouble(tanh_x); >
    static PyMethodDef superfastcode_methods[] = < // The first property is the name exposed to Python, fast_tanh // The second is the C++ function with the implementation // METH_O means it takes a single PyObject argument < "fast_tanh", (PyCFunction)tanh_impl, METH_O, nullptr >, // Terminate the array with an object containing nulls. < nullptr, nullptr, 0, nullptr >>; 
    static PyModuleDef superfastcode_module = < PyModuleDef_HEAD_INIT, "superfastcode", // Module name to use with Python import statements "Provides some functions, but faster", // Module description 0, superfastcode_methods // Structure that defines the methods of the module >; 
    PyMODINIT_FUNC PyInit_superfastcode()

    Использование PyBind11

    Если вы выполнили действия из предыдущего раздела, вы наверняка заметили, что использовали много стандартного кода для создания необходимых структур модулей для кода C++. PyBind11 упрощает этот процесс с помощью макросов в файле заголовка C++, которые позволяют получить тот же результат с гораздо меньшим объемом кода.

    Дополнительные сведения о коде в этом разделе см. в разделе Основы PyBind11.

    1. Установите PyBind11 с помощью pip: pip install pybind11 или py -m pip install pybind11 . Вы также можете установить PyBind11 с помощью окна «Окружения Python», а затем использовать его команду Открыть в PowerShell для выполнения следующего шага.
    2. В том же терминале выполните python -m pybind11 —includes или py -m pybind11 —includes . Это действие выводит список путей, которые следует добавить в свойство C/C++>Общие>Дополнительные каталоги включаемых файлов вашего проекта. Обязательно удалите префикс -I , если он присутствует.
    3. В верхнюю часть нового файла module.cpp, который не содержит изменения из предыдущего раздела, включите pybind11.h.

    #include 
    namespace py = pybind11; PYBIND11_MODULE(superfastcode2, m)

    Устранение ошибок компиляции

    Модуль C++ может не компилироваться по следующим причинам.

    • Ошибка: не удается обнаружить Python.h (E1696: не удается открыть исходный файл Python.h и/или C1083: не удается открыть включаемый файл: Python.h — не существует такого файла или каталога) Решение: проверьте, что путь в разделе C/C++>Общие>Дополнительные каталоги включаемых файлов в свойствах проекта указывает на папку include установки Python. См. шаг 6 в разделе Создание основного проекта C++. Дополнительные сведения о доступе к сведениям о конфигурации установки Python см . в документации по Python.
    • Ошибка: не удается обнаружить библиотеки Python Решение: проверьте, что путь в разделе Компоновщик>Общие>Дополнительные каталоги библиотек в свойствах проекта указывает на папку libs установки Python. См. шаг 6 в разделе Создание основного проекта C++. Дополнительные сведения о доступе к сведениям о конфигурации установки Python см . в документации по Python.
    • Ошибки компоновщика, связанные с решением целевой архитектуры: измените архитектуру проекта целевого объекта C++ на соответствие архитектуре установки Python. Например, если вы хотите использовать в проекте C++ версию Win32, но у вас установлена версия Python x64, измените проект C++ для работы с версией х64.

    Тестирование кода и сравнение результатов

    Теперь, когда библиотека DLL структурирована как расширения Python, можно ссылаться на них из проекта Python, импортировать модули и использовать их методы.

    Предоставление доступа к библиотеке DLL для Python

    Библиотеку DLL можно сделать доступной для Python несколькими способами. Покажем два метода, которые рекомендуется рассмотреть.

    Screenshot showing how to add a reference to the

    • Первый метод работает, если проект Python и проект C++ находятся в одном решении. Выполните следующие действия.
      1. В Обозревателе решений щелкните правой кнопкой мыши узел Ссылки в вашем проекте Python, а затем выберите команду Добавить ссылку.
      2. В открывшемся диалоговом окне перейдите на вкладку Проекты, выберите проекты superfastcode и superfastcode2 и нажмите кнопку OK.
    • В другом методе устанавливается модуль в вашей среде Python, что делает этот модуль доступным и для других проектов Python. Дополнительные сведения см. в документации по проекту setuptools. Выполните следующие действия.
      1. Создайте в проекте C++ файл с именем setup.py, щелкнув проект правой кнопкой мыши и выбрав пункт Добавить>Новый элемент.
      2. Выберите Файл C++ (. cpp), назначьте этому файлу имя setup.py и нажмите кнопку OK. Если файлу назначить имя с расширением .py, это позволяет Visual Studio распознать его как файл Python, несмотря на использование шаблона файла C++. Когда файл откроется в редакторе, вставьте в него следующий код в зависимости от метода расширения. Для расширений CPython (проект superfastcode)

    from setuptools import setup, Extension sfc_module = Extension('superfastcode', sources = ['module.cpp']) setup( name='superfastcode', version='1.0', description='Python Package with superfastcode C++ extension', ext_modules=[sfc_module] ) 

    Для PyBind11 (проект superfastcode2)

    from setuptools import setup, Extension import pybind11 cpp_args = ['-std=c++11', '-stdlib=libc++', '-mmacosx-version-min=10.7'] sfc_module = Extension( 'superfastcode2', sources=['module.cpp'], include_dirs=[pybind11.get_include()], language='c++', extra_compile_args=cpp_args, ) setup( name='superfastcode2', version='1.0', description='Python package with superfastcode2 C++ extension (PyBind11)', ext_modules=[sfc_module], ) 
    [build-system] requires = ["setuptools", "wheel", "pybind11"] build-backend = "setuptools.build_meta" 

    Совет Если пакет уже установлен, он появится в списке. Прежде чем продолжить, щелкните значок X, чтобы удалить его.

    Совет Если установка завершается неудачно из-за ошибки, связанной с разрешениями, добавьте в конец —user и попробуйте выполнить команду еще раз.

    Вызов библиотеки DLL из Python

    После того как вы сделаете библиотеки DLL доступными для Python, как описано в предыдущем разделе, можно вызывать функции superfastcode.fast_tanh и superfastcode2.fast_tanh2 из кода Python и сравнивать их эффективность с реализацией Python. Чтобы вызвать библиотеку DLL, выполните следующие действия.

      Добавьте следующие строки в файл .py, чтобы вызвать методы, экспортированные из библиотек DLL, и отобразить их выходные данные.

    from superfastcode import fast_tanh test(lambda d: [fast_tanh(x) for x in d], '[fast_tanh(x) for x in d] (CPython C++ extension)') from superfastcode2 import fast_tanh2 test(lambda d: [fast_tanh2(x) for x in d], '[fast_tanh2(x) for x in d] (PyBind11 C++ extension)') 

    Примечание. Если команда Запуск без отладки отключена, в Обозревателе решений щелкните правой кнопкой мыши проект Python и выберите команду Назначить запускаемым проектом.

    Убедитесь, что подпрограммы C++ выполняются примерно в 5–20 раз быстрее, чем реализация на Python. Обычно выводится следующий результат.

    Running benchmarks with COUNT = 500000 [tanh(x) for x in d] (Python implementation) took 0.758 seconds [fast_tanh(x) for x in d] (CPython C++ extension) took 0.076 seconds [fast_tanh2(x) for x in d] (PyBind11 C++ extension) took 0.204 seconds 

    В выходных данных вы можете увидеть, что расширение PyBind11 не такое быстрое, как расширение CPython, хотя оно все равно должно работать быстрее, чем прямая реализация на Python. Это различие в основном связано с тем, что мы использовали вызов METH_O , который не поддерживает несколько параметров, имен параметров или аргументов ключевых слов. PyBind11 формирует несколько более сложный код, чтобы предоставить вызывающим субъектам интерфейс, более похожий на Python. Но так как тестовый код вызывает функцию 500 000 раз, в результате эти дополнительные временные затраты могут сильно возрасти!

    Чтобы сократить временные затраты, можно переместить цикл for в машинный код. Этот подход предполагает использование протокола итератора (или типа py::iterable из PyBind11 в качестве параметра функции) для обработки каждого элемента. Удаление повторяющихся переходов между Python и C++ является эффективным способом сокращения времени, затрачиваемого на обработку последовательности.

    Устранение ошибок импорта

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

    • При сборке с помощью ссылки на проект убедитесь, что свойства проекта C++ соответствуют среде Python, активированной для проекта Python, особенно каталоги Include и Library.
    • Убедитесь, что ваш выходной файл имеет имя superfastcode.pyd. Файл с любым другим именем или расширением не будет импортирован.
    • Если вы установили модуль с помощью файла setup.py, убедитесь, что вы выполнили команду pip в среде Python, активированной для вашего проекта Python. При развертывании среды Python в обозревателе решений должна отображаться запись для superfastcode.

    Отладка кода C++

    Visual Studio поддерживает совместную отладку кода на Python и C++. В этом разделе вы пошагово выполните процесс с использованием проекта superfastcode. Этот процесс такой же, как для проекта superfastcode2.

      В Обозревателе решений щелкните проект Python правой кнопкой мыши, выберите Свойства, откройте вкладку Отладка и выберите Отладка>Разрешить отладку машинного кода.

    Совет При включении отладки машинного кода окно вывода Python может немедленно закрываться сразу после завершения программы без обычной паузы с сообщением Для продолжения нажмите любую клавишу. Решение: чтобы после включения отладки машинного кода принудительно приостановить выполнение программы, добавьте параметр -i в поле Запуск>Аргументы интерпретатора на вкладке Отладка. Этот аргумент переводит интерпретатор Python в интерактивный режим после выполнения кода, и для закрытия окна интерпретатора необходимо будет нажать клавиши CTRL+Z, а затем ВВОД. Кроме того, если вы не против изменения кода Python, можно добавить в конец программы операторы import os и os.system(«pause») . Этот код дублирует исходный запрос с приостановкой.

  • Чтобы сохранить изменения свойств, выберите пункт меню Файл>Сохранить.
  • В панели инструментов Visual Studio установите для конфигурации сборки режим Отладка. Screenshot of the
  • Так как в отладчике код обычно выполняется дольше, вы, возможно, захотите уменьшить значение переменной COUNT в файле .py приблизительно в пять раз. Например, вместо 500000 задать 100000.
  • В коде C++ установите точку останова в первой строке метода tanh_impl , а затем запустите отладчик, нажав клавишу F5 или выбрав в меню Отладка>Начать отладку. Когда выполнение доходит до кода точки останова, отладчик останавливается. Если точка останова не сработает, проверьте, выбрана ли конфигурация отладки и сохранен ли проект (при запуске отладчика он не сохраняется автоматически). Screenshot of C++ code that contains a breakpoint.
  • В точке останова вы можете пошагово проходить по коду C++, проверять переменные и т. д. Дополнительные сведения об этих функциях см. в разделе Одновременная отладка Python и C++.
  • Альтернативные подходы

    Существуют различные способы для создания расширений Python, приведенные в таблице ниже. Способы CPython и PyBind11 , указанные в первых двух строках, рассматриваются в этой статье.

    Подход Vintage Представители
    Модули расширений C/C++ для CPython 1991 Стандартная библиотека
    PyBind11 (рекомендуется для C++) 2015
    Cython (рекомендуется для C) 2007 gevent, kivy
    HPy 2019
    mypyc 2017
    ctypes 2003 oscrypto
    cffi 2013 cryptography, pypy
    SWIG 1996 crfsuite
    Boost.Python 2002
    cppyy 2017

    Связанный контент

    Полный пример из этого руководства см. на GitHub по ссылке python-samples-vs-cpp-extension.

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

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