我的初始目标是使用dll
在cygwin上打开一个ctypes
文件。但是我发现了一些问题。我发现只有ipython才会返回一个未知的sys.dl
有了Permission denied
一切看起来都很好:
$ 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>
通过
python
我得到错误:$ 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
我使用
ipython
对此进行了调查。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
谁是?我的安装中没有corina用户,窗口中也没有。科琳娜不是我安装的。它是一些硬编码的东西吗?
下面是我从
strace
中得到的信息: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
/home/corinna
在ipython中返回0x0,而在python中返回0x5b9c0000。我注意到在调用strace
之前,python
正在引发一个错误。编辑
我向Cygwin的邮件列表发送了一条消息,有关此问题的answer of Corinna是:
这不是塞格温的错,阿法克斯。cygwin从不加载函数
依次的。就信息而言,这也有点偏瘦。
担心的。例如,我们看不到进程如何调用dlopen。
科琳娜
如何解决这个问题?
我以前的测试使用
dlopen
最初当我问我的问题时,我只是在玩。
我正在开发32位Cygwin和Windows7。
使用ipython,当我尝试使用
cwdstuff::get
加载dll时,得到了一个dlopen
。 最佳答案
更多想法:
检查访问DLL的用户是否相同。你这样做:import getpass
print(getpass.getuser())
检查当前流程实际执行的操作。我没有使用cygwin,但是在Linuxshell中,可执行文件strace
应该向您展示这一点。
用法:获取当前进程的PID:import os; os.getpid()
之后,您可以使用(从python/ipython控制台外部)命令strace -p <the pid> -e file
。在此安装之后,您可以尝试加载您的DLL。
备注:-e file
标志的书写方式应与此完全相同。单词file
告诉strace报告进程执行的所有文件操作。如果在python/ipython上运行时没有差异,可以尝试删除-e file
标志。然后,您将看到进程进行的所有系统调用。我还没有在这样的窗口上工作过,所以这可能在那里根本不起作用,但至少在Linux上,这应该向您报告进程所做的一切。你至少可以看到所有打开的文件,但也可以在那里找到更有趣的东西。如果输出相同,那么可以在python/ipython中进一步调试问题。这基本上需要@doug blank建议的内容,但我也建议调查每个接触到的名称(变量)。self
、_dlopen
和mode
名称听起来也可能包含有用的信息。
否则,请执行dir(self)
和dir(_dlopen)
以查看在那里可以找到哪些可能已被ipython修改的其他属性。
先试试这些,然后我们可以帮你进一步挖掘。