我有一个主脚本,它导入了我正在编写的另一个python库。 该库包含以下命令:
print getattr(__builtins__, "list")
当我从库中调用它时会产生以下错误:
'dict' object has no attribute 'list'
但是,如果我将相同的命令复制并粘贴到主脚本中,它可以正常工作。任何想法为什么这不起作用?
我的主文件的标题如下所示:
#/usr/bin/env python
from sys import argv
import re, sys, os, argparse
sys.path.extend(map(os.path.abspath, ['C:/Users/xxxx/scripts/modules/']))
import general
我"将军的标题"图书馆是:
#!/usr/bin/env python
from sys import argv
import re, sys, os, argparse
def getBuiltin(name):
##Convert a string into an attribute
try:
return getattr(__builtins__, name)
except Exception as e:
print "Unhandled type in function \"get_builtin\""
print name
print e
exit()
我这样叫图书馆:
print general.getBuiltin("list")
其中," getBuiltin"是我的功能名称
答案 0 :(得分:1)
您还可以查看此问题:Python: What's the difference between __builtin__ and __builtins__?
正如您在答案中所看到的, builtins 在主模块和另一个模块中有所不同:
直接来自python文档: http://docs.python.org/reference/executionmodel.html
默认情况下,在主模块中, builtins 是内置的 模块内置(注意:没有'');在任何其他模块中, builtins 是内置模块本身字典的别名。
builtins 可以设置为用户创建的字典,以创建一种弱形式的受限执行。
CPython实施细节:用户不应触及 builtins ;它 严格来说是一个实现细节。想要覆盖值的用户 在builtins命名空间中应该导入内置(没有'') 模块并适当地修改其属性。一个名称空间 模块在第一次导入模块时自动创建。 请注意,在Python3中,模块 builtin 已重命名为 内置以避免一些混乱。