Использование Cython для предоставления функциональности другому приложению - PullRequest
3 голосов
/ 03 ноября 2010

У меня есть код C ++, который показывает, как расширить программное обеспечение, скомпилировав его в DLL и поместив в папку приложения:

#include <windows.h>

#include <DemoPlugin.h>

/** A helper function to convert a char array into a
    LPBYTE array. */
LPBYTE message(const char* message, long* pLen)
{
  size_t length = strlen(message);
  LPBYTE mem = (LPBYTE) GlobalAlloc(GPTR, length + 1);
  for (unsigned int i = 0; i < length; i++)
  {
    mem[i] = message[i];
  }
  *pLen = length + 1;
  return mem;
}

long __stdcall Execute(char* pMethodName, char* pParams,
  char** ppBuffer, long* pBuffSize, long* pBuffType)
{
  *pBuffType = 1;

  if (strcmp(pMethodName, "") == 0)
  {
    *ppBuffer = (char*) message("Hello, World!",
  pBuffSize);
  }
  else if (strcmp(pMethodName, "Count") == 0)
  {
    char buffer[1024];
    int length = strlen(pParams);
    *ppBuffer = (char*) message(itoa(length, buffer, 10),
  pBuffSize);
  }
  else
  {
    *ppBuffer = (char*) message("Incorrect usage.",
  pBuffSize);
  }

  return 0;
}

Возможно ли сделать плагин таким образом, используя Cython? Или даже py2exe? У DLL просто должна быть точка входа, верно?

Или я должен просто скомпилировать его и встроить Python, используя elmer ?

1 Ответ

3 голосов
/ 03 ноября 2010

Я думаю, что решение состоит в том, чтобы использовать оба.Позвольте мне объяснить.

Cython делает удобным создание быстрого плагина с использованием python, но неудобным (если вообще возможно) для создания правильного «вида» DLL.Вам, вероятно, придется использовать автономный режим, чтобы включить необходимую среду выполнения Python, а затем связываться с сгенерированным кодом c, чтобы скомпилировать соответствующую DLL.

И наоборот, elmer делает удобным создание DLL, но запускает«чистый» код Python, который может быть недостаточно быстрым.Я предполагаю, что скорость - это проблема, потому что вы рассматриваете Cython вместо простого встраивания.

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


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

...