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不是来自我的装置.这是一些硬编码的东西吗?
现在,这是我得到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
Run Code Online (Sandbox Code Playgroud)
dlopen在IPython中返回0x0,而它为python返回0x5B9C0000.我注意到cwdstuff::get在dlopen调用之前会引发错误.
编辑 我向Cygwin的邮件列表发送了一条消息,Corinna对此问题的回答是:
这不是Cygwin的错,AFAICS.Cygwin从不按顺序加载函数.就信息而言,这也是精益方面的一点.例如,人们无法看到进程如何调用dlopen.Corinna如何解决这个问题?
ctypes最初当我问我的问题时,我只是在玩ctypes.我正在使用Cygwin 32位和Windows 7.通过IPython我得到了一个OSError当我尝试加载dll时使用cdll.LoadLibrary.
两个想法:
1)在下一个单元格中,键入%pdb,然后以交互方式"print self._name"查看它是什么.
2)使用cdll.LoadLibrary("foo.dll")的完整路径来查看是否有效.
一旦你知道问题是什么,那么你可以决定它是谁的错误,并报告它(可能是一个ctypes问题,但可能是ipython)
更多想法:
检查访问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和名称听起来也可能包含有用的信息_dlopen。mode
否则,请执行dir(self)和 操作dir(_dlopen),看看您可以在那里找到哪些其他属性可能已被 IPYthon 修改。
首先尝试这些,然后我们可以帮助您进一步挖掘。
| 归档时间: |
|
| 查看次数: |
594 次 |
| 最近记录: |