Как создать pyd файл

Обновлено: 01.07.2024

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

В этом уроке вы узнаете:

  • Как PyInstaller может упростить распространение приложений
  • Как использовать PyInstaller в ваших собственных проектах
  • Как отлаживать ошибки PyInstaller
  • Что PyInstaller не может

PyInstaller дает вам возможность создать папку или исполняемый файл, который пользователи могут сразу запустить без дополнительной установки. Чтобы полностью оценить возможности PyInstaller, полезно еще раз вернуться к некоторым проблемам распространения, которых помогает избежать PyInstaller.

Содержание

Проблемы распространения ↑

Настройка проекта Python может быть неприятной, особенно для не разработчиков. Часто установка начинается с открытия Терминала, который не запускается для огромной группы потенциальных пользователей. Это препятствие останавливает пользователей еще до того, как руководство по установке углубится в сложные детали виртуальных сред, версий Python и т.д. и множество потенциальных зависимостей.

Вспомните, через что вы обычно проходите, настраивая новую машину для разработки Python. Вероятно, это выглядит примерно так:

  • Загрузите и установите нужную версию Python;
  • Настроить менеджер зависимостей;
  • Настроить виртуальную среду;
  • Получить копию своего кода;
  • Установить зависимости.

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

Эти проблемы взорвутся, если вашему пользователю посчастливится добраться до части установки, связанной с зависимостями. Это стало намного лучше за последние несколько лет с преобладанием колес, но для некоторых зависимостей по-прежнему требуются компиляторы C/C++ или даже FORTRAN!

PyInstaller ↑

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

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

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

Кроме того, PyInstaller может создавать исполняемые файлы для Windows, Linux или macOS. Это означает, что пользователи Windows получат .exe, пользователи Linux получат обычный исполняемый файл, а пользователи macOS получат пакет .app. На этот счет есть некоторые предостережения. См. Раздел ограничений для получения дополнительной информации.

Подготовка проекта ↑

PyInstaller требует, чтобы ваше приложение соответствовало некоторой минимальной структуре, а именно, чтобы у вас был сценарий CLI для запуска вашего приложения. Часто это означает создание небольшого скрипта вне вашего пакета Python, который просто импортирует ваш пакет и запускает main().

Вы можете попробовать это в своем собственном проекте или попробовать на проекте чтения каналов Real Python. Для получения более подробной информации о проекте для чтения ознакомьтесь с руководством по публикации пакета на PyPI.

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

Этот скрипт cli.py вызывает main() для запуска программы чтения каналов.

Создать этот сценарий точки входа несложно, когда вы работаете над собственным проектом, потому что вы знакомы с кодом. Однако найти точку входа в чужой код не так просто. В этом случае вы можете начать с просмотра файла setup.py в третьем -партийный проект.

Найдите ссылку на аргумент entry_points в файле setup.py проекта. Например, вот проект для чтения setup.py:

Как видите, сценарий cli.py точки входа вызывает ту же функцию, что и аргумент entry_points.

После этого изменения каталог проекта ридера должен выглядеть так, если вы извлекли его из папки с именем reader:

Обратите внимание, что сам код считывателя не изменился, только новый файл с именем cli.py. Этот сценарий точки входа обычно является всем, что необходимо для использования вашего проекта с PyInstaller.

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

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

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

pip установит зависимости PyInstaller вместе с новой командой: pyinstaller. PyInstaller можно импортировать в код Python и использовать в качестве библиотеки, но вы, скорее всего, будете использовать его только как инструмент командной строки.

Вы будете использовать интерфейс библиотеки, если будете создавать свои собственные файлы ловушек.

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

PyInstaller поддерживает множество популярных пакетов, таких как NumPy, PyQt и Matplotlib, без каких-либо дополнительных действий с вашей стороны. Вы можете узнать больше о списке пакетов, которые PyInstaller официально поддерживает, обратившись к документации PyInstaller.

Не беспокойтесь, если некоторые из ваших зависимостей не указаны в официальной документации. Многие пакеты Python работают нормально. Фактически, PyInstaller достаточно популярен, поэтому во многих проектах есть объяснения, как заставить вещи работать с PyInstaller.

Одним словом, шансы на то, что ваш проект сработает «из коробки», высоки.

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

Например, введите следующее после того, как вы cd в каталог программы чтения верхнего уровня, если вы подписаны на проект вместе с проектом чтения каналов:

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

Копаемся в артефактах PyInstaller ↑

PyInstaller сложен внутри и при работе создаёт массу информации. Итак, важно знать, на чем сосредоточиться в первую очередь. А именно исполняемый файл, который вы можете распространять среди пользователей, и потенциальную отладочную информацию. По умолчанию команда pyinstaller создает несколько интересных моментов:

  • Файл спецификации *.spec
  • Папка сборки Build
  • Папка дистрибутива Dist

Файл спецификаций ↑

По умолчанию файл спецификации будет назван в честь вашего сценария командной строки. Продолжая наш предыдущий пример, вы увидите файл с именем cli.spec. Вот как выглядит файл спецификации по умолчанию после запуска PyInstaller в файле cli.py:

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

Не волнуйтесь, вам не нужно понимать приведенный выше код, чтобы эффективно использовать PyInstaller!

Этот файл можно изменить и повторно использовать для создания исполняемых файлов позже. Вы можете сделать будущие сборки немного быстрее, предоставив этот файл спецификации вместо сценария точки входа для команды pyinstaller.

Есть несколько конкретных вариантов использования файлов спецификации PyInstaller. Однако для простых проектов вам не нужно беспокоиться об этих деталях, если вы не хотите сильно настраивать способ сборки вашего проекта.

Папка сборки Build ↑

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

Папка Dist ↑

После сборки вы получите папку dist, подобную следующей:

Вы также найдете множество файлов с расширениями .so, .pyd и .dll в зависимости от вашей операционной системы. Это общие библиотеки, которые представляют зависимости вашего проекта, которые PyInstaller создал и собрал.

Примечание. Вы можете добавить *.spec, build и dist в свой файл .gitignore, чтобы сохранить статус git в чистоте, если вы используете git для контроля версий. Файл gitignore GitHub по умолчанию для проектов Python уже делает это за вас.

Вы захотите распространить всю папку dist/cli, но вы можете переименовать cli во все, что вам подходит.

На этом этапе вы можете попробовать запустить исполняемый файл dist/cli/cli.exe, если вы следуете примеру программы чтения каналов.

Настройка ваших сборок ↑

У PyInstaller есть множество параметров, которые могут быть предоставлены в виде файлов спецификаций или обычных параметров интерфейса командной строки (CLI). Ниже вы найдете некоторые из наиболее распространенных и полезных настроек.

Вы можете создать исполняемый файл под названием realpython из cli.py скрипт с такой командой:

Эта опция не требует аргументов. Чтобы объединить свой проект в один файл, вы можете выполнить сборку с помощью такой команды:

С помощью приведенной выше команды ваша папка dist/ будет содержать только один исполняемый файл вместо папки со всеми зависимостями в отдельных файлах.

Эта опция требует имени пакета, который вы хотите включить в свой исполняемый файл.. Например, если ваш проект импортировал библиотеку запросов внутри функции, PyInstaller не будет автоматически включать запросы в ваш исполняемый файл. Вы можете использовать следующую команду для принудительного включения запросов:

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

Это полезно, если вы хотите объединить файлы конфигурации, примеры или другие данные, не связанные с кодом. Пример этого вы увидите позже, если будете следить за проектом чтения каналов.

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

-w — избегайте автоматического открытия окна консоли для ведения журнала стандартного вывода

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

.spec файл

Поскольку это обычный скрипт Python, вы можете делать в нем практически все, что угодно. Вы можете обратиться к официальной документации файла спецификации PyInstaller для получения дополнительной информации об этом API.

Тестирование нового исполняемого файла ↑

Ключ заключается в том, чтобы запустить полученный исполняемый файл без активации вашей среды разработки. Это означает запуск без virtualenv, conda или любой другой среды, которая может получить доступ к вашей установке Python. Помните, что одна из основных целей исполняемого файла, созданного PyInstaller, состоит в том, чтобы пользователям не нужно было ничего устанавливать на их машинах.

Взяв пример с программы чтения каналов, вы заметите, что запустить исполняемый файл cli по умолчанию в папке dist/cli не удается. К счастью, ошибка указывает на проблему:

Эта команда указывает PyInstaller включить файл version.txt в папку importlib_resources в новую папку в вашей сборке с именем importlib_resources.

Примечание. В командах pyinstaller используется символ \, чтобы упростить чтение команды. Вы можете опустить \ при выполнении команд самостоятельно или скопировать и вставить команды как-ниже при условии, что вы используете те же пути.

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

Теперь запуск нового исполняемого файла приведет к новой ошибке, связанной с файлом config.cfg.

Этот файл требуется для проекта чтения каналов, поэтому обязательно включите его в свою сборку:

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

На этом этапе у вас должен быть рабочий исполняемый файл, который можно передавать напрямую пользователям!

Отладка исполняемых файлов PyInstaller ↑

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

Ниже приведены несколько распространенных стратегий, которые не указаны в определенном порядке.Часто одна из этих стратегий или их комбинация приводит к прорыву в сложных сеансах отладки.

Используйте терминал ↑

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

Не забудьте удалить флаг -w build, чтобы увидеть весь стандартный вывод в окне консоли. Часто вы увидите исключения ImportError, если зависимость отсутствует.

Файлы отладки ↑

Сборки одного каталога ↑

Дополнительные параметры интерфейса командной строки ↑

Вот пример того, как может выглядеть ваш файл build.txt:

В этом файле будет много подробной информации о том, что было включено в вашу сборку, почему что-то не было включено и как был упакован исполняемый файл.

Примечание: -y и -Параметры clean полезны при перестройке, особенно при первоначальной настройке сборок или при сборке с непрерывной интеграцией. Эти параметры удаляют старые сборки и исключают необходимость ввода данных пользователем в процессе сборки.

Дополнительные документы PyInstaller ↑

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

Помощь в обнаружении зависимостей ↑

Ограничения ↑

PyInstaller невероятно мощный, но у него есть некоторые ограничения. Некоторые из ограничений обсуждались ранее: скрытый импорт и относительный импорт в сценариях точки входа.

Например,если вы хотите нацелиться на широкий спектр машин Linux, вы можете использовать более старую версию CentOS. Это обеспечит совместимость с большинством версий новее, чем та, на которой вы построили. Это та же стратегия, которая описана в PEP 0513, и это то, что PyPA рекомендует для создания совместимых колес.

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

Заключение ↑

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

  1. Создайте сценарий точки входа, который вызывает вашу основную функцию.
  2. Установите PyInstaller.
  3. Запустите PyInstaller на своей точке входа.
  4. Протестируйте свой новый исполняемый файл.
  5. Отправьте полученную папку dist/ пользователям.

Ваши пользователи не должны знать, какую версию Python вы использовали или что ваше приложение вообще использует Python!

В этой статье мы рассмотрим типы файлов Python .pyc, .pyo и .pyd, а также то, как они используются для хранения байт-кода, который будет импортирован другими программами.

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

Байт-код и виртуальная машина

Python поставляется с интерпретатором, который можно использовать, как REPL (read-eval-print-loop) в интерактивном режиме в командной строке. В качестве альтернативы вы можете вызвать Python со сценариями кода Python.

В обоих случаях интерпретатор анализирует ваш ввод, а затем компилирует его в байт-код (машинные инструкции нижнего уровня), который затем выполняется «питоническим представлением» компьютера. Это представление Pythonic называется виртуальной машиной.

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

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

В этой статье мы рассмотрим каждый тип файла по отдельности, но сначала мы кратко рассмотрим виртуальную машину и байт-код в Python.

Тип файла .pyc

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

Вот пример модуля, который мы хотим импортировать. Этот модуль вычисляет факториалы.

Теперь, когда вы просто запускаете этот модуль из командной строки, используя math_helpers.py, файлы .pyc не создаются.

Теперь давайте импортируем это в другой модуль, как показано ниже. Мы импортируем факториал из файла math_helpers.py и используем его для вычисления факториала 6.

Мы можем запустить этот скрипт, вызвав computations.py в терминале. Мы не только получаем результат 6 факториала, то есть 720, но мы также замечаем, что интерпретатор автоматически создает файл math_helpers.pyc. Это происходит потому, что модуль вычислений импортирует модуль math_helpers. Чтобы в дальнейшем ускорить загрузку импортированного модуля, интерпретатор создает файл байт-кода модуля.

При обновлении файла исходного кода обновляется и файл .pyc. Это происходит всякий раз, когда время обновления исходного кода отличается от времени обновления файла байт-кода и обеспечивает актуальность байт-кода.

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

Поскольку файлы .pyc не зависят от платформы, они могут использоваться на машинах с разной архитектурой. Однако, если разработчики имеют разное время в своих системах, проверка файлов .pyc в системе управления версиями может создать временные метки, которые фактически относятся к будущему для показаний времени других. Таким образом, обновления исходного кода больше не вызывают изменений в байт-коде. Это может быть неприятной ошибкой. Лучший способ избежать этого – добавить файлы .pyc в список игнорирования в вашей системе контроля версий.

Тип файла .pyo

Тип файла .pyo также создается интерпретатором при импорте модуля. Однако файл .pyo является результатом запуска интерпретатора при включенных настройках оптимизации.

Оптимизатор включается добавлением флага «-O» при вызове интерпретатора Python. Вот пример кода, иллюстрирующий использование оптимизации. Во-первых, у нас есть модуль, определяющий лямбда, которая похожа на функцию, но определяется более лаконично.

Если вы помните из предыдущего примера, нам нужно будет импортировать этот модуль, чтобы использовать его. В следующем листинге кода мы импортируем lambdas.py и используем лямбда g.

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

Чтобы запустить этот пример с помощью оптимизатора, вызовите команду:

Мы не только получаем правильный результат удвоения 7, то есть 14, в качестве вывода в командной строке, но мы также видим, что для нас автоматически создается новый файл байт-кода. Этот файл основан на импорте lambdas.py при вызове using_lambdas.py. Поскольку у нас был включен оптимизатор, создается файл байт-кода .pyo. В данном случае он называется lambdas.pyo.

Оптимизатор, который мало что делает, удаляет утверждения assert из вашего байт-кода. Результат в большинстве случаев будет незаметен, но иногда он может понадобиться.

Также обратите внимание, что, поскольку создается файл байт-кода .pyo, он заменяет файл .pyc, который был бы создан без оптимизации. При обновлении файла исходного кода файл .pyo обновляется всякий раз, когда время обновления исходного кода отличается от времени обновления файла байт-кода.

Тип файла .pyd

Тип файла .pyd, в отличие от двух предыдущих, зависит от платформы для класса операционных систем Windows. Таким образом, его можно часто встретить в персональных и корпоративных выпусках Windows 10, 8, 7 и других.

В экосистеме Windows файл .pyd – это файл библиотеки, содержащий код Python, который может вызываться и использоваться другими приложениями. Чтобы сделать эту библиотеку доступной для других программ, она упакована в виде библиотеки динамической компоновки.

Библиотеки динамической компоновки (DLL) – это библиотеки кода Windows, которые связаны с вызывающими программами во время выполнения. Основное преимущество связывания с библиотеками во время выполнения, такими как библиотеки DLL, заключается в том, что это облегчает повторное использование кода, модульную архитектуру и более быстрый запуск программы. В результате библиотеки DLL предоставляют множество функций в операционных системах Windows.

Файл .pyd – это библиотека динамической компоновки, которая содержит модуль Python или набор модулей, которые будут вызываться другим кодом. Чтобы создать файл .pyd, вам необходимо создать модуль с именем, например, example.pyd. В этом модуле вам нужно будет создать функцию с именем PyInit_example(). Когда программы вызывают эту библиотеку, им нужно вызвать import foo, и функция PyInit_example() будет запущена.

Различия между этими типами файлов

Хотя между этими типами файлов существует некоторое сходство, есть также и некоторые большие различия. Например, хотя файлы .pyc и .pyo похожи тем, что содержат байт-код Python, они отличаются тем, что файлы .pyo более компактны благодаря оптимизации, выполненной интерпретатором.

Третий тип файла, .pyd, отличается от двух предыдущих тем, что представляет собой динамически подключаемую библиотеку, которая будет использоваться в операционной системе Windows. Два других типа файлов можно использовать в любой операционной системе, а не только в Windows.

Однако каждый из этих типов файлов включает код, который вызывается и используется другими программами Python.

Заключение

В этой статье мы описали, как каждый специальный тип файла, .pyc, .pyo и .pyd, используется виртуальной машиной для повторного использования кода. Как мы видели, каждый файл имеет свои особые цели и варианты использования, будь то ускорение загрузки модуля, ускорение выполнения или облегчение повторного использования кода в определенных операционных системах.

В общем, возникла проблема с созданием PYD. При установке скрипта должен компилироваться PYD из *.c. Но у меня вылезают одни ошибки. Пробовал на Pyhton27 при VS 2008 и на Python23 (на который и установлен скрипт) при VS 6.0. Тот и тот вариант не работает и выдаёт ошибки.
Ошибки такие:
warning C4273: ‘PyMarshal_ReadLastObjectFromFile’: inconsistent dll linkage. dllexport assumed.
error LNK2001: unresolved external symbol.
Может, кто-нибудь сможет создать этот pyd, если это не сложно?
Заранее благодарен за любую помощь.

Отредактировано kalumb (Дек. 22, 2013 08:56:42)

Создание PYD

какой символ не найден? Подробнее объясните как и что вы собираете. Без этой информации никто вам не поможет. Больше всего похоже на неправильные опции сборки динамической библиотеки.

Создание PYD

Я собираю decompyle. На компьютере 3 пиона: на 2.7 я пишу, 2.3 нужен был для запуска игры, 3.3 бездействует. Также установлены VS 6.0 и VS 2008.
Я запускаю командную строку, перехожу в каталог со скриптом и прописываю команду:
python setup.py Install.
После этого выводятся эти ошибки.
Лог и seup.py в прикреплении.

attachment

Прикреплённый файлы:
Log.rar (2,5 KБ)

Создание PYD

не очень понял как такое получилось

Сначала уберите warnings.
Очевидно надо искать куда делся initdecompyle. Смотрите где он в исходниках, объектниках и почему не подключился. Может у него получилось неправильное имя в объектных модулях.

Отредактировано doza_and (Дек. 23, 2013 21:00:57)

Создание PYD

attachment

Прикреплённый файлы:
decompyle_2.3.2.tar.gz (406,8 KБ)

Здесь мы не будем рассуждать о плюсах и минусах языков.


Мы будем использовать их вместе!




В этом нам поможет замечательная библиотека pyd. С её помощью можно как вызывать код на python из кода на d, так и наоборот.

Рассмотрим первый вариант. Заполняем файл dub.json:


subConfigurations указывает, что мы будем использовать python 3.4

Запускаем сборку и её результат

Всё настолько просто!

Попробуем немного усложнить. Добавим функцию сложения чисел в myscript.py:


И вызовем её из кода на D. Добавим это в функцию main.main:


Усложнить не получилось.

Класс InterpContext олицетворяет контекст интерпретатора (как ни странно) и мы можем добавлять туда переменные таким простым способом. Поля x и y не являются частью объекта script — таких полей нет, но это работает потому, что в языке D есть возможность конвертировать вызовы несуществующих методов класса (или структуры) в вызов метода opDispatch, который, как в данном случае, может быть свойством.

Таким же способом мы можем взять объект из контекста:


Да и функции можно вызывать практически так же:

синтаксис property в языке D является давно обсуждаемой темой, а конкретно вопрос связан с ситуацией, когда property возвращает объект с методом opCall:

Теперь попробуем наоборот из кода на python вызвать код на D. Создадим новую папку для этого.
Создадим файл dcode.d с содержанием:


И файл setup_my_dcode.py (имя никак не влияет):


соберём наше расширение (именно build, а не install, чтобы не засорять систему тестовыми файлами):


создасться папочка build такого содержания

Нас интересует build/lib.linux-x86_64-3.4/dcode.cpython-34m.so. Копируем его в текущую директорию или переходим в папку с ним и можем проверять прямо в интерактивном интерпретаторе:


И опять всё достаточно просто!

И опять попробуем всё усложнить — добавим класс в dcode.d:


К сожалению в этой ситуации всё действительно немного усложнилось. Для работы с классами D в python нужно объявлять конструкторы, функции и т.д.

О вариантах применения говорить не нужно: их много и они интересны. Стоит упомянуть, что библиотека ещё не дошла до стабильной версии 1.0.0 и могут встречаться ошибки.

Я нашёл только одну проблему: нельзя запустить код на D из кода на python, встроенного в код на D:


Очень приятная документация по проекту находится здесь и ещё примеры здесь.

Читайте также: