我的初始目标是使用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_dlopenmode名称听起来也可能包含有用的信息。
否则,请执行dir(self)dir(_dlopen)以查看在那里可以找到哪些可能已被ipython修改的其他属性。
先试试这些,然后我们可以帮你进一步挖掘。

10-06 05:21
查看更多