2013-10-18 48 views

回答

3

我不知道官方的方式,但這是一種方法。

通知os.fork變化時,它被猴子打補丁:

>>> import os 
>>> os.fork 
<built-in function fork> 
>>> import gevent.monkey; gevent.monkey.patch_all() 
>>> os.fork 
<function fork at 0x100535140> 

同時注意什麼gevent.fork是:

>>> import gevent 
>>> gevent.fork 
<function fork at 0x100535140> 

所以,當猴子修補所有(或只是OS):

>>> is_monkeypatched = gevent.fork == os.fork 
1

簡短的回答是「不」(顯然,人們期望看到如果有的話,在the docs中提供的API)。

較長的答案是「大部分」,使用monkey.saved。檢查源代碼可以看到,有效的所有常用修補程序都會更新此字典並引用原始項目,因此可以使用monkey.get_original()來檢索它們。如果您認爲官方性需要文檔,這不是官方的,但它似乎不是作爲內部API使用的,儘管它並未以monkey.__all__的形式出口。

如果通過你的問題你的意思是「有任何猴子修補發生?」那麼你可以測試if monkey.saved: ...

如果您的意思是「模塊XXX已被猴子修補?」那麼你可以測試適當的名字,例如if "threading" in monkey.saved: ...

作爲參考,在做一個monkey.patch_all()這裏是你會看到那裏。 (請注意,patch_all()實際上並沒有打補丁的一切。它省去了子,SYS和事件在默認情況下,所以我包括他們在下面。)

>>> import os, gevent 
>>> os.name, gevent.__version__ 
('posix', '1.0.1') 
>>> from gevent import monkey 
>>> monkey.patch_all(subprocess=True, sys=True, Event=True) 
>>> monkey.saved.keys() 
['socket', 'thread', 'ssl', 'gevent.socket', 'subprocess', 'sys', 'threading', 'time', 'os', 'select'] 
1

docs

from gevent import monkey 

monkey.is_module_patched('socket')