簡體   English   中英

在python 3.5.x中使用`urllib`意外加載模塊

[英]Unexpected module loading using `urllib` in python 3.5.x

在某些系統上使用urllib加載幻影模塊時,似乎出現了一些意外行為。 行為如下:

Python 3.5.2 (default, Aug 18 2017, 17:48:00) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
>>> urllib.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'urllib' has no attribute 'foo'
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'error', 'parse', 'request', 'response']

意外的行為是僅在嘗試訪問錯誤的屬性並獲取AttributeError之后才加載其他名稱。 在具有相同python解釋器(Ubuntu 16.04 apt python3 )的另一個系統上,這不會發生:

Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
>>> import urllib
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
>>> urllib.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'urllib' has no attribute 'foo'
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

我們已經在多種操作系統和解釋器上進行了測試,唯一展現出意外行為的是從apt獲得的Ubuntu 14.04 Python 3.4.0。 在這個系統上,我們還驗證了當引發完全不相關的異常時,似乎也會發生這種情況。

Python 3.4.0 (default, Apr 11 2014, 13:05:18) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> raise Exception('uh oh')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: uh oh
>>> import urllib
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'error', 'parse', 'request', 'response']

這里發生了什么?

您已經安裝了Apport ,這是Ubuntu用來捕獲軟件崩潰的軟件包。

該軟件包包括一個安裝sys.excepthook函數的Python軟件包; 每當Python程序中引發未處理的異常時,都會調用此鈎子。 該掛鈎的實現間接加載urllib.*模塊。

通過在交互式解釋器中觸發異常,您觸發了該鈎子,從而導致運行額外的Python代碼,從而增加了導入。

參見apport_python_hook.py源代碼 調用該鈎子時,將加載各種apport模塊,其中包括導入urllib模塊的apport.report

您可以通過在/etc/default/apport中將enabled = 0設置enabled = 0來禁用該掛鈎。

將來,如果您希望看到導入,可以使用-v命令行開關運行Python或設置PYTHONVERBOSE環境變量 ; 那會告訴您打開Python時會加載apport_python_hook模塊,並且在引發異常時會加載更多模塊。

暫無
暫無

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

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