Моя первоначальная цель - открыть файл dll
на Cygwin с помощью ctypes
. Однако я нашел некоторые проблемы с этим. Я выкопал до sys.dl
, который возвращает неизвестный Permission denied
только на IPython.
С python
все выглядит нормально:
$ ls
my.dll
$ python
Python 2.7.8 (default, Jul 28 2014, 01:34:03)
[GCC 4.8.3] on cygwin
>>> import dl
>>> dl.open('my.dll')
<dl.dl object at 0xfffaa0c0>
С ipython
я получаю ошибку:
$ ipython
Python 2.7.8 (default, Jul 28 2014, 01:34:03)
In [1]: import dl
In [2]: dl.open('my.dll')
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-2-c681630fa713> in <module>()
----> 1 dl.open('my.dll')
error: Permission denied
Я исследовал это с использованием strace
. Выходной журнал для `IPython огромен, более 4 МБ. К счастью, я обнаружил некоторые странные вещи:
symlink.check(C:\Users\user\Home\projects\foo\my.dll, 0x28AB88) (0x4022)
35 2705178 [main] python2.7 16924 path_conv::check: this->path(C:\Users\user\Home\projects\foo\my.dll), has_acls(1)
37 2705215 [main] python2.7 16924 cwdstuff::get: posix /cygdrive/c/Users/user/Home/projects/foo
32 2705247 [main] python2.7 16924 cwdstuff::get: (C:\Users\user\Home\projects\foo) = cwdstuff::get (0x8006ECF0, 32768, 0, 0), errno 11
--- Process 14376, exception c0000138 at 7726163E
3286 2708533 [main] python2.7 16924 seterrno_from_win_error: /home/corinna/src/cygwin/cygwin-1.7.35/cygwin-1.7.35-1.i686/src/src/winsup/cygwin/dlfcn.cc:174 windows error 182
42 2708575 [main] python2.7 16924 geterrno_from_win_error: unknown windows error 182, setting errno to 13
36 2708611 [main] python2.7 16924 dlopen: ret 0x0
Кто /home/corinna
? У меня нет пользователя corinna в моей установке, ни на моей Windows. Коринна не приходит из моей установки. Это какие-то жестко закодированные вещи?
Теперь вот что я получаю от strace
для python
:
symlink.check(C:\Users\user\Home\projects\foo\my.dll, 0x28B728) (0x4022)
26 10440048 [main] python 12604 path_conv::check: this->path(C:\Users\user\Home\projects\foo\my.dll), has_acls(1)
23 10440071 [main] python 12604 cwdstuff::get: posix /cygdrive/c/Users/user/Home/projects/foo
25 10440096 [main] python 12604 cwdstuff::get: (C:\Users\user\Home\projects\foo) = cwdstuff::get (0x8006ECF0, 32768, 0, 0), errno 0
3405 10443501 [main] python 12604 dlopen: ret 0x5B9C0000
dlopen
возвращает 0x0 в IPython, пока он возвращает 0x5B9C0000 для python. Я заметил, что cwdstuff::get
вызывает ошибку до вызова dlopen
.
ИЗМЕНИТЬ Я отправил сообщение в список рассылки Cygwin, а ответ Коринны в отношении этой проблемы:
Это не ошибка Cygwin, AFAICS. Cygwin никогда не загружает функции по порядковое. Это также немного на стороне берега, поскольку информация обеспокоен. Например, невозможно увидеть, как процесс вызывает dlopen, например. Коринна Как решить эту проблему?
Мои предыдущие тесты с использованием ctypes
Сначала, когда я задал свой вопрос, я просто играл с ctypes
.
Я работаю над Cygwin 32-bit и Windows 7.
С IPython я получил OSError
, когда пытался загрузить DLL с помощью cdll.LoadLibrary
.