Rahul VB Ответов: 2

Как импортировать код C через Python


Я пытаюсь импортировать код c из скрипта python.

Я получаю ошибку, как показано ниже:
Цитата:
Обратная трассировка (самый недавний призыв последнего):
Файл "function.py", строка 3, в <модуле>
hllDll = под.Уиндл ("someso.dll")
Файл "C:\Python35\lib\ctypes\__init__.py", строка 347, in __init__
сам._handle = _dlopen(самовыдвижение._name, режим)
OSError: [WinError 193] %1 не является допустимым приложением Win32


Моя цель-использовать функцию "myFunc" в моем скрипте python.

Что я уже пробовал:

Я создал файл с именем : "simple.c", как показано ниже:
int myFunc(int num)
{
  if (num == 0)
    return 0;
  else
    return num;
}


Я скомпилировал его, чтобы создать общий объект с именем "someso.so"

Ниже приведен мой код python:
import ctypes
hllDll = ctypes.WinDLL ("someso.dll")


Я также пробовал другие модули под.
У меня есть 64-битная windows и 64-битное приложение python.

CPallini

Как Ричард как уже отмечалось, вы должны создать динамическую библиотеку Windows (DLL).
На .так что расширение-это типичный Линукс и близких.

2 Ответов

Рейтинг:
7

Rahul VB

Я хотел бы поблагодарить Ричарда Маккатчана за его полезное решение. Используя это, я придумал способ вызова DLL из кода python.
1. Во-первых, если ваше приложение python является 64-битным, dll, которую вы создаете с помощью MingW, также должна быть 64-битной. поэтому обязательно загрузите совместимую версию dll-файла.
2. Пожалуйста, не создавайте общие объекты и не пытайтесь импортировать их, это не сработает.
Общие объекты используются в системах POSIX. Если вы сделаете это, то получите следующую ошибку:

Цитата:
Обратная трассировка (самый недавний призыв последнего):
Файл "function.py", строка 3, в <модуле>
hllDll = под.Уиндл ("someso.dll")
Файл "C:\Python35\lib\ctypes\__init__.py", строка 347, in __init__
сам._handle = _dlopen(самовыдвижение._name, режим)
OSError: [WinError 193] %1 не является допустимым приложением Win32


Допустим, у нас есть программа ниже c в файле под названием mydll.c:
__declspec(dllexport) int __cdecl Add(int a, int b)
{
  return (a + b);
}

- ____declspec(dllexport): Это в основном позволяет нам указать спецификатор класса хранения.
- Это указывает компилятору, что функция или objecy экспортируется из dll-файла.
- Аналогично существует еще один спецификатор класса хранения под названием dllimport, который сообщает компилятору, что
экспортированный объект можно импортировать в другой файл.

Примечание: Вы можете использовать компилятор Mingw в соответствии с вашим приложением python, то есть 32 или 64 бит.
Вы можете скомпилировать его, используя следующие шаги:

gcc -c mydll.c
gcc -o basicDLL.dll -s -shared mydll.o -Wl,--subsystem,windows
python basicApplication.py
python basicApplication.py


Давайте посмотрим на флаги, используемые в приведенных выше командах для компиляции:
-Wl: все, что следует за этим флагом, передается в качестве аргумента компоновщику.
Это в конечном итоге станет вызовом компоновщика, как показано ниже:
ld --Подсистема windows
В основном этот вызов будет указывать компоновщику установить тип подсистемы заголовка PE в windows.
Это будет означать, что будет создана библиотека dll, которая компилируется с помощью mingw и должна быть запущена в windows.

Давайте посмотрим на код на Python :
from ctypes import *
lib = CDLL('basicDLL')
print (lib.Add(1,2))


Назовите этот файл чем угодно, скажем basicApplication.пай и давай запустим его.
Выход равен 3

Обратите внимание: внося какие-либо изменения в библиотеку dll, придется перестраиваться заново. Это означает, что вы сначала компилируете файл .c, а затем генерируете из него dll.

ctypes-это модуль, который очень полезен для расширения функциональных возможностей c и python друг с другом.


Richard MacCutchan

Или вы можете сделать это проще, используя компилятор Microsoft C, который поставляется бесплатно с Visual Studio Community Edition.

Rahul VB

Отлично, попробую и это тоже. Спасибо

Рейтинг:
20

Richard MacCutchan

У вас есть создать общий объект someso.so (который не будет работать в Windows), но вы пытаетесь загрузить someso.dll.


CPallini

Действительно. 5.

Richard MacCutchan

Спасибо.

Rahul VB

Спасибо за решение, вы правы. Я установил компилятор Ming-w для 64-битных приложений. Создал код c, содержащий атрибут экспорта dll, указывающий компилятору, что приложение предназначено для экспорта выбранной функции.
Я тоже опубликую решение, Пожалуйста, не стесняйтесь просматривать и комментировать его.
Еще раз спасибо за помощь