Форум программистов, компьютерный форум, киберфорум
Python: IDE, инструментарий
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491

Добавить расширение файла для импорта (к .pyd добавить .dll)

01.09.2020, 05:47. Показов 3428. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе утро,

Я компилирую динамическую библиотеку в С++, которая получает расширение .dll. Затем с помощью утилиты я делаю эту динамическую библиотеку доступной для питона.
Проблема в том, что питоновский import mymodule подразумевает, что mymodule имеет расширение .pyd. Чтобы не приходилось вручную менять расширение с .dll на .pyd, хотелось бы чтобы питон распознавал также .dll расширение (именно не сменить расширение, а добавить).

Возможно ли это сделать? Подразумеваю что надо использовать python-config

Windows 10
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.09.2020, 05:47
Ответы с готовыми решениями:

Как добавить свою dll в таблицу импорта
Добрый день. Подскажите пожалуйста, как добавить dll(свою) в таблицу импорта своей программы написанной на c++. Чтобы я смог увидеть...

Добавить расширение к имени файла
т.е. чтобы постоянно не писать его в программе... void vvod(char name) { char dat=".dat"; fstream FileOutput; ...

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

10
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
01.09.2020, 07:40
Kerim_Geophysic, не знаю что ты там делаешь доступным для питона и как, но чтобы использовать dll хватит простого модуля ctypes.
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
01.09.2020, 14:55
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
хотелось бы чтобы питон распознавал также .dll расширение
Python
1
2
3
4
>>> import importlib
>>> importlib.machinery.all_suffixes()
['.py', '.pyw', '.pyc', '.cp38-win_amd64.pyd', '.pyd']
>>>
Хотелку можно адресовать Гвидо, чтобы он исправил встроенную библиотеку.
Но Гвидо уже отошел от дел...

P.S. Разумеется в importlib есть возможность добавить свою dll, но проще сменить расширение.
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
01.09.2020, 18:26
Правильный подход - ставить расширение pyd. pyd - Это указатель на то, что либа является именно питоновским модулем. И, как и всякий правильный подход, реализуется проще, чем неправильный.
1
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
01.09.2020, 18:37  [ТС]
DmFat, ctypes не подходит, я решил использовать pybind11
dondublon, я догадываюсь, но как мне решить проблему: я компилирую в С++ динамическую библиотеку, которую можно использовать в С++ (.dll) и в питоне через import mylib (здесь она должна быть с расширением .pyd).
Очень не хотелось бы после компиляции библиотеки в С++ копировать ее и одну из копий переименовывать в .pyd
В моем проекте это должна быть библиотека общая для питона и С++

Есть ли идеи как поступить?

Добавлено через 3 минуты
Garry Galler, пытаюсь так сделать:
Python
1
2
3
4
5
import importlib
importlib.machinery.SOURCE_SUFFIXES.append('.dll')
importlib.machinery.all_suffixes()
['.py', '.pyw', '.dll', '.pyc', '.cp38-win_amd64.pyd', '.pyd']
import PyBind11_proba    # моя .dll, import PyBind11_proba.dll тоже не работает
но получаю ошибку:
Traceback (most recent call last):
File "C:\Anaconda3\envs\MyEnv38\lib\site-packages\IPython\core\interactiveshell.p y", line 3417, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-5-7554b7aab515>", line 1, in <module>
import PyBind11_proba
File "C:\Program Files\JetBrains\PyCharm 2020.1\plugins\python\helpers\pydev\_pyd ev_bundle\pydev_import_hook.py", line 21, in do_import
module = self._system_import(name, *args, **kwargs)
ModuleNotFoundError: No module named 'PyBind11_proba'
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
01.09.2020, 18:39
Лучший ответ Сообщение было отмечено Kerim_Geophysic как решение

Решение

Python
1
2
from importlib.machinery ExtensionFileLoader
ExtensionFileLoader("addList", r"c:\addList.dll").load_module()
P.S. Это вариант предложенный shsv. По его же мнению другого способа нет или, по меньшей мере, никто его не знает.
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
01.09.2020, 18:41
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
Очень не хотелось бы после компиляции библиотеки в С++ копировать ее и одну из копий переименовывать в .pyd
Не знаю, как в вашем случае, но вообще в обычных проектах visual studio имя либы задаётся в настройках проекта. Укажите там .pyd и всё. Если не VS - то тоже наверняка должно настраиваться.
1
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
01.09.2020, 19:04  [ТС]
Garry Galler, спасибо, сейчас работает:
Python
1
2
3
from importlib.machinery import ExtensionFileLoader
myvar = ExtensionFileLoader("PyBind11_proba", r"PyBind11_proba.dll").load_module()
myvar.add(2,1)    # add(int i, int j) моя функция
Где можно почитать про ExtensionFileLoader? в Гугле пишу "ExtensionFileLoader python" ничего не находит. Мне просто не понятен синтаксис, а именно первый аргумент ("PyBind11_proba", r"PyBind11_proba.dll") для чего? я не могу вызвать мою функцию так:
Python
1
PyBind11_proba.add(2,1)    # получу ошибку
Добавлено через 56 секунд
dondublon, спасибо, надо поискать как это делается в Qt
Оба варианта рассматриваю .dll -> .pyd или оставить расширение как .dll
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
01.09.2020, 19:12
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
Мне просто не понятен синтаксис, а именно первый аргумент
importlib.machinery.ExtensionFileLoader( fullname, path)
The fullname argument specifies the name of the module the loader is to support. The path argument is the path to the extension module’s file.
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
в Гугле пишу "ExtensionFileLoader python" ничего не находит
Оф. дока + исходники CPython.
-------------------------------
Можно же так писать:
Python
1
PyBind11_proba = ExtensionFileLoader("PyBind11_proba", r"PyBind11_proba.dll").load_module()
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
01.09.2020, 19:46
Kerim_Geophysic, Qt - это, вроде, не компилятор и не система сборки.
99%, что у вас VS либо gcc в каком-то виде, часто идёт с cmake. Надо там искать.
1
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
01.09.2020, 23:45  [ТС]
dondublon, я имел ввиду, что разбираться придется с QMake (аналог СМаке, но в Qt)
А так да, компилятор вужуал студо MSVC 2017 x64, работаю на видоус
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.09.2020, 23:45
Помогаю со студенческими работами здесь

Как добавить новое расширение файла - в контекстное меню Тotal Commander
total commander Подскажите как добавить новое расширение файла - в контекстное меню Тотал Коммандера ? Это там, где надо выбрать...

Как добавить расширение для монитора 1440х900
Помогите добавить расширение для монитора Samsung SyncMaster 920nw ПК Dell Optiplex 755 как мне помнится там максимальное расширение...

Добавить запись в таблицу импорта
Необходимо в таблицу импорта dll добавить новую запись об импортируемой функции. Я прочитал статью как это сделать (кому интересно вот она...

Правила dll и добавление в таблицу импорта exe файла
Добрый вечер! Такая ситуация: Написал dll, включил ее в проект под vs 2010 - всё работает. Написал редактор таблицы импорта, добавил...

Добавить макет в расширение
БП 3.0 Добавил макет акта о работах счет на оплату, отредактировал как надо все ок. Добавил УПД, ТОРГ12 он все ровно подхватывает макеты из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru