我最初的目标是使用dll
在Cygwin上打开ctypes
文件。但是我发现了一些问题。我挖到sys.dl
,只在IPython上返回一个未知的Permission denied
。
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的输出日志是巨大的,超过4MB。幸运的是,我发现了一些奇怪的事情:
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上。 Corinna不是来自我的装置。这是一些硬编码的东西吗?
现在,我来自strace
的{{1}}:
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
在IPython中返回0x0,而python则返回0x5B9C0000。我注意到dlopen
在调用cwdstuff::get
之前引发了错误。
修改 我向Cygwin的邮件列表发送了一条消息,关于这个问题的answer of Corinna是:
这不是Cygwin的错,AFAICS。 Cygwin从不加载函数 序。就信息而言,这也是精益方面的一点 关心。例如,人们无法看到进程如何调用dlopen。 科琳娜 如何解决这个问题?
dlopen
最初,当我问我的问题时,我只是在玩ctypes
。
我正在研究Cygwin 32位和Windows 7。
在IPython中,当我尝试使用ctypes
加载dll时,我得到OSError
。
答案 0 :(得分:6)
两个想法:
1)在下一个单元格中,键入%pdb,然后以交互方式“print self._name”查看它是什么。
2)使用cdll.LoadLibrary(“foo.dll”)的完整路径来查看是否有效。
一旦你知道问题是什么,那么你可以决定它是谁的错误并报告它(可能是一个ctypes问题,但可能是ipython)
答案 1 :(得分:4)
也许Python可执行文件和IPython内核使用不同的清单文件来定义加载策略?
尝试在两种情况下都将DLL路径附加到sys.path。
检查两种情况下的管理员权限(UAC)。
使用依赖性walker来计算此DLL的依赖关系。也许问题来自依赖?
您的机器可能有多个此DLL的副本?
最后,您可以使用Process Explorer查看两种情况下加载的DLL列表,并查看任何差异。
我正在处理一个非常类似的问题: