Загрузка DLL из встроенного кода Python в C - PullRequest
4 голосов
/ 08 апреля 2011

Суть моей проблемы заключается в следующем:

Я занимаюсь разработкой кода для Windows XP в C с MS Visual Studio 10.0, и мне нужно встроить Python для выполнения некоторых графиков, управления файлами и некоторых других вещей.,У меня были проблемы с sys.path при поиске моих модулей Pure-Python, но я исправил эту проблему, изменив PYTHONPATH.

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

Из обычной командной строки python это прекрасно работает:

import tarfile
tar=tarfile.open('Code.tar.bz2','w:bz2')
tar.add('Code',arcname='Code')
tar.close()

Но когда я звонюэтот код из моего c-кода, он дает мне эту ошибку:

Traceback (most recent call last):
  File "<string>", line 4, in <module>
  File "D:\My_Documents\Code\ScrollModel\trunk\PythonCode.py", line 20, in Colle
ctFiles
    tar=tarfile.open(os.path.join(runPath,'CODE.tar.bz2'),'w:bz2')
  File "c:\Python26\lib\tarfile.py", line 1671, in open
    return func(name, filemode, fileobj, **kwargs)
  File "c:\Python26\lib\tarfile.py", line 1737, in bz2open
    raise CompressionError("bz2 module is not available")
tarfile.CompressionError: bz2 module is not available

У меня есть подозрение, что проблема похожа на описанную в разделе 5.6 Embedded Python , но этоСложно сказать.Для чего это стоит, если я сделаю

Py_Initialize();
PyRun_SimpleString("import ssl\n");
Py_Finalize();

, он тоже не сработает, и я получу ошибку ImportError.

У кого-нибудь были такие проблемы?Я что-то упускаю из виду?

Ответы [ 3 ]

2 голосов
/ 12 апреля 2011

Попробуйте, это работает на моей машине.

Создайте простое консольное приложение Windows в Visual Studio 2010 (удалите предварительно скомпилированные заголовки в мастере). Замените сгенерированный код этим:

#include <Python.h>

int main(int argc, char *argv[]) {
    Py_Initialize();

    PyRun_SimpleString("import ssl        \n"
                       "for f in dir(ssl):\n"
                       "    print f       \n" );

    Py_Finalize();
    return 0;
}

С PYTHONHOME, установленным на что-то вроде c: \ Python ...

  • добавить C: \ Python \ Включить в путь включения
  • добавить C: \ Python \ Libs в путь к библиотеке
  • добавить python26.lib к входу компоновщика (настроить с помощью вашей версии Python)

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

Я тоже пробовал с Mingw. Тот же файл, сборка с этой командной строкой:

gcc -Wall -o test.exe embeed.c -I%PYTHONHOME%\Include -L%PYTHONHOME%\libs -lpython26
0 голосов
/ 08 апреля 2011

У меня была похожая проблема с Boost C ++ DLL.Любая внешняя DLL должна быть в пути поиска DLL.

По моему опыту, PYTHONPATH влияет на модуль Python (оператор импорта в Python завершается вызовом LoadLibrary), и параметры сборки не имеют к этому никакого отношения.

Когда вы загружаете DLL,Windows не волнует, что это за процесс.Другими словами, Python следует тем же правилам загрузки DLL , что и Блокнот.Вы можете подтвердить, что столкнулись с проблемой пути к Windows, скопировав любую отсутствующую DLL в тот же каталог, что и расширение Python, или в каталог по вашему пути.

Чтобы найти, какая DLL требуется для любого другого исполняемого файла илиDLL, просто откройте файл DLL или EXE с помощью DependencyWalker .Также есть меню «Профиль», которое позволит вам запускать ваше приложение и смотреть его поиск и загрузку DLL.

0 голосов
/ 08 апреля 2011

Эй, я задал аналогичный вопрос , моя операционная система Linux .

Когда я компилирую файл c, следует добавить параметр $(python-config --cflags --ldflags),как

gcc test.c $(python-config --cflags --ldflags) -o test

Я думаю, что в Windows вы также можете проверить опцию python-config, надеюсь, это поможет!

...