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

now*_*wox 13 python cygwin ctypes ipython

我最初的目标是dll使用Cygwin 打开一个文件ctypes.但是我发现了一些问题.我挖到了只在IPython上sys.dl返回一个未知的东西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>
Run Code Online (Sandbox Code Playgroud)

随着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
Run Code Online (Sandbox Code Playgroud)

我对此进行了调查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
Run Code Online (Sandbox Code Playgroud)

是谁/home/corinna?我的安装中没有corinna用户,也不在我的Windows上.Corinna不是来自我的装置.这是一些硬编码的东西吗?

现在,这是我得到stracepython:

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   
Run Code Online (Sandbox Code Playgroud)

dlopen在IPython中返回0x0,而它为python返回0x5B9C0000.我注意到cwdstuff::getdlopen调用之前会引发错误.

编辑 我向Cygwin的邮件列表发送了一条消息,Corinna对此问题的回答是:

这不是Cygwin的错,AFAICS.Cygwin从不按顺序加载函数.就信息而言,这也是精益方面的一点.例如,人们无法看到进程如何调用dlopen.Corinna如何解决这个问题?

我早期的测试使用 ctypes

最初当我问我的问题时,我只是在玩ctypes.我正在使用Cygwin 32位和Windows 7.通过IPython我得到了一个OSError当我尝试加载dll时使用cdll.LoadLibrary.

Dou*_*ank 6

两个想法:

1)在下一个单元格中,键入%pdb,然后以交互方式"print self._name"查看它是什么.

2)使用cdll.LoadLibrary("foo.dll")的完整路径来查看是否有效.

一旦你知道问题是什么,那么你可以决定它是谁的错误,并报告它(可能是一个ctypes问题,但可能是ipython)


vla*_*ean 4

更多想法:

  • 检查访问DLL的用户是否相同。你这样做:

    import getpass

    print(getpass.getuser())

  • 检查当前进程实际在做什么。我没有使用 cygwin,但在 linux shell 中,可执行文件strace应该向您显示这一点。用法:获取当前进程的 PID:import os; os.getpid() 之后,您可以使用(从 python/ipython 控制台外部)命令strace -p <the pid> -e file。完成此设置后,您可以尝试加载 DLL。

备注:-e file标志应该完全这样写。该词file告诉 strace 报告该进程进行的所有文件操作。如果在 python/ipython 上运行时没有出现任何差异,您可以尝试删除该-e file标志。然后您将看到该进程进行的所有系统调用。我没有在 Windows 上工作过,所以这可能根本不起作用,但至少在 Linux 上,这应该向您报告该过程所做的一切。您至少可以在那里看到所有打开的文件,但也可以在那里找到更有趣的东西。如果输出相同,则可以在 python/ipython 中进一步调试问题。这基本上需要 @Doug Blank 建议的内容,但我还建议调查每个被触及的名称(变量)。、self和名称听起来也可能包含有用的信息_dlopenmode

否则,请执行dir(self)和 操作dir(_dlopen),看看您可以在那里找到哪些其他属性可能已被 IPYthon 修改。

首先尝试这些,然后我们可以帮助您进一步挖掘。