簡體   English   中英

dl.open()使用ipython但不使用python的權限被拒絕

[英]Permission denied on dl.open() with ipython but not with python

我最初的目標是使用ctypes在Cygwin上打開一個dll文件。 但是我發現了一些問題。 我挖到了sys.dl ,它返回一個僅在IPython上Permission denied的未知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 for 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   

dlopen在IPython中返回0x0,而它為python返回0x5B9C0000。 我注意到cwdstuff::get在調用dlopen之前引發了錯誤。

編輯我向Cygwin的郵件列表發送了一條消息,Corinna對此問題的回答是:

這不是Cygwin的錯,AFAICS。 Cygwin從不按順序加載函數。 就信息而言,這也是精益方面的一點。 例如,人們無法看到進程如何調用dlopen。 Corinna如何解決這個問題?

我之前使用ctypes測試

最初,當我問我的問題時,我只是在玩ctypes 我正在使用Cygwin 32位和Windows 7.使用IPython時,當我嘗試使用cdll.LoadLibrary加載dll時,我遇到了OSError

兩個想法:

1)在下一個單元格中,鍵入%pdb,然后以交互方式“print self._name”查看它是什么。

2)使用cdll.LoadLibrary(“foo.dll”)的完整路徑來查看是否有效。

一旦你知道問題是什么,那么你可以決定它是誰的錯誤,並報告它(可能是一個ctypes問題,但可能是ipython)

  • 也許Python可執行文件和IPython內核使用不同的清單文件來定義加載策略?

  • 嘗試在兩種情況下將DLL路徑附加到sys.path。

  • 在兩種情況下都檢查管理員權限(UAC)。

  • 使用依賴性walker來計算此DLL的依賴關系。 也許問題來自依賴?

  • 可能你的機器有這個DLL的多個副本?

  • 最后,您可以使用Process Explorer查看在兩種情況下加載的DLL列表,並查看任何差異。

我正在研究一個非常類似的問題:

ipython筆記本和腳本差異 - 加載DLL

更多想法:

  • 檢查訪問DLL的用戶是否相同。 你這樣做:

    import getpass

    print(getpass.getuser())

  • 檢查當前進程實際執行的操作。 我沒有使用Cygwin的,但在Linux shell中的可執行文件strace應該給你看看這個。 用法:獲取當前進程的PID: import os; os.getpid() import os; os.getpid()在此之后,您可以使用(從python / ipython控制台外部命令strace -p <the pid> -e file 。完成此設置后,您可以嘗試加載DLL。

備注: -e file標志應該完全相同。 word file告訴strace報告進程所做的所有文件操作。 如果在python / ipython上運行時沒有出現差異,可以嘗試刪除-e file標志。 然后,您將看到該進程所做的所有系統調用。 我沒有像那樣在Windows上工作,所以這可能根本不起作用,但至少在linux上,這應該向你報告該過程所做的一切。 你可以看到至少所有打開的文件,但也可以找到更多有趣的東西。 如果輸出相同,則可以在python / ipython中進一步調試問題。 這基本上需要@Doug Blank建議的內容,但我還建議調查每個被觸及的名稱(變量)。 self_dlopenmode名稱聽起來也可能包含有用的信息。

否則,執行dir(self)dir(_dlopen)以查看可能在IPYthon中修改過的其他屬性。

首先嘗試這些,然后我們可以幫助您進一步挖掘。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM