虽然很不高兴,
some Python 2 code reloads
sys
to restore the
sys.setdefaultencoding()
function
. 这几乎总是这个问题的原因。
所以你可以察觉到
系统
通过检查
setdefaultencoding
属性:
if hasattr(sys, 'setdefaultencoding'):
这只适用于python 2。或者你可以增加
sys.flags
struct sequence
加上一个字段:
from collections import namedtuple
import sys, re
_sys_flags_fields = re.findall('(\w+)=\d', repr(sys.flags))
_sys_flags_augmented = namedtuple('flags', _sys_flags_fields + ['sys_not_reloaded'])
sys.flags = _sys_flags_augmented(*sys.flags + (1,))
之后,您可以使用:
if not getattr(sys.flags, 'sys_not_reloaded', 0):
增广
小精灵
比其他的都安全
系统
操作,因为第三方代码可能依赖于
系统
不受限制的属性和方法,
和
它也适用于python 3。
你可以
防止
系统
通过包装重新装载
__builtin__.reload
/
importlib.reload
/
imp.reload
:
try:
import __builtin__ as targetmodule
except ImportError:
try:
import importlib as targetmodule
targetmodule.reload
except (ImportError, AttributeError):
import imp as targetmodule
from functools import wraps
def reload_wrapper(f):
@wraps(f)
def wrapper(module):
if getattr(module, '__name__', None) == 'sys':
raise ValueError('sys should never be reloaded!')
return f(module)
return wrapper
targetmodule.reload = reload_wrapper(targetmodule.reload)
您可以使用
warnings
module
或其他机制来记录或制造噪音
系统
正在重新加载;您可能希望
include the caller
变成这样的警告。
尽可能早地执行上面的模块,以确保您可以捕获正在执行此操作的代码,方法可能是将其插入
sitecustomize
模块,或通过从
.pth
文件安装到
site-packages
目录。任何一行
甲状旁腺激素
以开头的文件
import
是
executed as Python code by the
site.py
module at Python startup
,因此该文件中包含以下内容:
import yourpackage.sysreload_neutraliser
将在python启动时注入导入。