4 python python-itertools python-3.x python-internals
迭代工具C模块是否以某种方式包含在3.x中的主Python二进制文件中?
假设构建并包含C模块,它看起来像是:
>>> import inspect
>>> import itertools
>>>
>>> inspect.getsourcefile(itertools)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python3/3.4.3_2/Frameworks/Python.framework/Versions/3.4/lib/python3.4/inspect.py", line 571, in getsourcefile
filename = getfile(object)
File "/usr/local/Cellar/python3/3.4.3_2/Frameworks/Python.framework/Versions/3.4/lib/python3.4/inspect.py", line 518, in getfile
raise TypeError('{!r} is a built-in module'.format(object))
TypeError: <module 'itertools' (built-in)> is a built-in module
Run Code Online (Sandbox Code Playgroud)
我itertools.so在我的系统上找不到Python 3.x,但是有一个2.7.
我注意到其他一些C模块作为共享对象(locate '.so' | grep -E '^/usr/local/' | grep '.so'例如mmap.so)存在于磁盘上,那么处理的是itertools什么?如果没有共享库,我该如何使用它?
小智 7
makefile中的提示位于Python包装器附近inspect.py:
/usr/local/Cellar/python3/3.4.3_2/Frameworks/Python.framework/Versions/3.4/lib/python3.4/config-3.4m/Makefile
我们可以看到itertools.c源代码的构建规则:
1668 Modules/itertoolsmodule.o: $(srcdir)/Modules/itertoolsmodule.c; $(CC) $(PY_CORE_CFLAGS) -c $(srcdir)/Modules/itertoolsmodule.c -o Modules/itertoolsmodule.o
Run Code Online (Sandbox Code Playgroud)
然后跟踪它,看看它被捆绑在:
24 MODOBJS= .. Modules/itertoolsmodule.o ... Modules/xxsubtype.o
462 # objects that get linked into the Python library
463 LIBRARY_OBJS_OMIT_FROZEN= \
...
470 $(MODOBJS)
471
472 LIBRARY_OBJS= \
473 $(LIBRARY_OBJS_OMIT_FROZEN) \
474 Python/frozen.o
...
553 # Build the interpreter
554 $(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
555 $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
556
557 platform: $(BUILDPYTHON) pybuilddir.txt
558 $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print(get_platform()+"-"+sys.version[0: 3])' >platform
589 # Build static library
...
598 $(AR) $(ARFLAGS) $@ $(MODOBJS)
599 $(RANLIB) $@
944 $(LIBRARY_OBJS) $(MODOBJS) Modules/python.o: $(PYTHON_HEADERS)
Run Code Online (Sandbox Code Playgroud)
或者如果通过distutils,路径将是这样的:/usr/local/Cellar/python3/3.4.3_2/Frameworks/Python.framework/Versions/3.4/lib/python3.4/_sysconfigdata.py
并假设它内置于动态库中:
? ~ ? strings /usr/local/Cellar/python3/3.4.3_2/Frameworks/Python.framework/Versions/3.4/lib/libpython3.4.dylib | grep itertools
itertools
itertools._tee_dataobject
itertools._tee
itertools._grouper
itertools.groupby
itertools.repeat
itertools.product
...
Run Code Online (Sandbox Code Playgroud)
这意味着在构建时,itertools.c模块包含在libpython动态库中,这意味着它现在是标准库的一部分.
在Python 3中,itertools扩展被编译为主Python二进制文件:
>>> import sys
>>> 'itertools' in sys.builtin_module_names
True
Run Code Online (Sandbox Code Playgroud)
一个字符串元组,给出了编译到此Python解释器中的所有模块的名称.
该模块已添加到Python二进制文件中,因为它在Python标准库中使用得非常广泛.
要包含的模块列表取自Python发行版中的Modules/Setup.dist文件 ; itertools与之一起被添加_collections,因为它是该模块的瞬态依赖.请参阅问题#9545.
| 归档时间: |
|
| 查看次数: |
368 次 |
| 最近记录: |