LINUX.ORG.RU

Как собрать и подключить модуль: Python extending, DLL + GCC/MinGW32?


0

0

Собрать python.exe у меня получилось, он работает. Но ни он,
ни python.exe из официальной сборки, не видят DLL-модуль, лежащий
в текущей директории:

$ /usr/lib/wine/wine.bin python.exe -v -S -W ignore prog.py
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# \home\pacify\prog/Lib/warnings.pyc matches \home\pacify\prog/Lib/warnings.py
import warnings # precompiled from \home\pacify\prog/Lib/warnings.pyc
# \home\pacify\prog/Lib/types.pyc matches \home\pacify\prog/Lib/types.py
import types # precompiled from \home\pacify\prog/Lib/types.pyc
import _types # builtin
# \home\pacify\prog/Lib/linecache.pyc matches \home\pacify\prog/Lib/linecache.py
import linecache # precompiled from \home\pacify\prog/Lib/linecache.pyc
# \home\pacify\prog/Lib/os.pyc matches \home\pacify\prog/Lib/os.py
import os # precompiled from \home\pacify\prog/Lib/os.pyc
Python 2.5.1 (r251:54863, Jan 27 2008, 21:52:48)
[GCC 3.4.5 (mingw special)] on linux2
Traceback (most recent call last):
File "prog.py", line 3, in <module>
import pymodx as modx
ImportError: No module named pymodx
# clear __builtin__._
# clear sys.path
....

Среда сборки и выполнения: Debian 4.0r0 "Etch", GCC/MinGW32, wine

Ссылки по теме:
http://mail.python.org/pipermail/python-bugs-list/2006-April/033140.html
http://www.mingw.org/MinGWiki/index.php/Python%20extensions

Как подключить DLL-модуль?

★★★★★

Выше был приведен лог для Python-2.5.1, который я собрал GCC в Debian'е.

Вот лог для Python-3.0a2, также собранный GCC/MinGW:

$ /usr/lib/wine/wine.bin python.exe -S -W ignore prog.py
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
File "\usr\src\Python-3.0a2/Lib/io.py", line 32, in <module>
import os
File "\usrc\src\Python-3.0a2/Lib/os.py", line 116, in <module>
raise ImportError('no os specific module found')
ImportError: no os specific module found

Возможно, разработчики Python'а решили отказаться от DLL-модулей.
Это можно увидеть из содержания Python/dynload_win.c:

Python-3.0a2/Python/dynload_win.c:
const struct filedescr _PyImport_DynLoadFiletab[] = {
#ifdef _DEBUG
{"_d.pyd", "rb", C_EXTENSION},
#else
{".pyd", "rb", C_EXTENSION},
#endif
{0, 0}
};

Python-2.5.1/Python/dynload_win.c:
const struct filedescr _PyImport_DynLoadFiletab[] = {
#ifdef _DEBUG
{"_d.pyd", "rb", C_EXTENSION},
/* Temporarily disable .dll, to avoid conflicts between sqlite3.dll
and the sqlite3 package. If this needs to be reverted for 2.5,
some other solution for the naming conflict must be found.
{"_d.dll", "rb", C_EXTENSION},
*/
#else
{".pyd", "rb", C_EXTENSION},
/* Likewise
{".dll", "rb", C_EXTENSION},
*/
#endif
{0, 0}
};

pacify ★★★★★
() автор топика

Тебе нужен именно лично собранный Питон, готовый не подходит?

Самые очевидные вещи вроде PYTHONPATH и LD_LIBRARY_PATH ты уже проверил?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

1. Готовый Питон тянет за собой библиотеки (DLL) из MS Visual Studio (так как собран MSVC++). Поэтому он мне не подходит.
2. Питон под Линукс подхватывает подуль в виде .so из текущей директории, под Windows по-идее тоже должен искать DLL в текущей.
3. PYTHONPATH для 2.5.1 и 3.0a2 сейчас попробую под Windows Vista ...

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

> Возможно, разработчики Python'а решили отказаться от DLL-модулей.
> Это можно увидеть из содержания Python/dynload_win.c:

Вообщем, я попробовал откомпилировать модуль виндовым GCC/MinGW32,
переименовал его в .pyd - виндовый Питон подхватил модуль.
То есть, разработчики Питона решили не искать .dll-файлы,
но модули по-прежнему завернуты в динамические библиотеки (.pyd).

P.S. Проблема кросс-компиляции модулей под винду осталась.

pacify ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.