dl.open()使用ipython但不使用python的权限被拒绝

时间:2015-03-17 11:08:01

标签: python cygwin ipython ctypes

我最初的目标是使用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

2 个答案:

答案 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列表,并查看任何差异。

我正在处理一个非常类似的问题:

ipython notebook & script difference - loading DLLs