我该如何学习一个给定的Python模块源文件安装在哪里?在Windows和Linux上的方法是否不同?
我尝试查找特定的datetime
模块的源代码,但我也对更通用的答案感兴趣。
对于一个纯Python模块,您可以通过查看themodule.__file__
来找到源代码。
然而,datetime模块是用C编写的,因此datetime.__file__
指向.so文件(在Windows上没有datetime.__file__
),因此您无法查看源代码。
如果您下载了Python源代码压缩包并将其解压,则可以在 Modules 子目录中找到模块的代码。
例如,如果您想找到Python 2.6的datetime代码,可以查看
Python-2.6/Modules/datetimemodule.c
您还可以在github网站上找到此文件的最新版本,链接为https://github.com/python/cpython/blob/main/Modules/_datetimemodule.c
从命令行运行python -v
命令应该会告诉你正在导入的内容以及它们的来源。在Windows和Mac OS X上,这对我有效。
C:\>python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# C:\Python24\lib\site.pyc has bad mtime
import site # from C:\Python24\lib\site.py
# wrote C:\Python24\lib\site.pyc
# C:\Python24\lib\os.pyc has bad mtime
import os # from C:\Python24\lib\os.py
# wrote C:\Python24\lib\os.pyc
import nt # builtin
# C:\Python24\lib\ntpath.pyc has bad mtime
...
我不确定我的安装中那些坏的mtime是什么!
python3 -v
。您将获得命令结果。 - Lalarukh khan我知道这个答案晚了4年,但现有的答案会误导人。
正确的方法从不是__file__
,也不是尝试遍历 sys.path
并搜索自己(除非你需要向后兼容2.1及以前的版本)。
应该使用inspect
模块,特别是getfile
或getsourcefile
函数。
除非你想学习和实现规则(这些规则对于CPython 2.x来说已经有文件记录,但很痛苦,并且其他实现方式或3.x没有文件记录),将.pyc
映射到.py
文件;处理.zip归档、egg和模块包;尝试不支持__file__
的路径获取.so
/.pyd
文件的不同方法;弄清楚Jython/IronPython/PyPy等的工作原理。如果你想这样做,请继续。
与此同时,从Python 2.0版本开始的每个版本的源代码都可以在网上找到,网址是http://hg.python.org/cpython/file/X.Y/
(例如,2.7或3.3)。因此,一旦你发现inspect.getfile(datetime)
是一个.so
或.pyd
文件,例如/usr/local/lib/python2.7/lib-dynload/datetime.so
,你可以在Modules目录中查找它。严格来说,并没有确切的方法可以确定哪个文件定义了哪个模块,但几乎所有的文件要么是foo.c
,要么是foomodule.c
,所以猜测datetimemodule.c就是你想要的。
__file__
?我理解在没有了解meta_path的情况下,爬取sys.path可能会很麻烦,但你是否关注于__file__
定义和二进制文件之间的命名空间问题? - user559633__file__
有效,inspect.getfile
都有效;没有猜测是否使用__file__
比使用inspect模块更好的情况。 - abarnertpip show $module
命令,就可以返回所在位置。$module
是指占位变量,而不是字面上要键入的内容。例如,对于任何m
,都可以输入m=numpy; pip show $m
等等。 - michaelpip
可能与在python中调用的不同。相反,您应该执行python -m pip show $module
。请参见umesh的答案。 - wisbuckysys.path
列表包含在运行时搜索模块的目录列表:
python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
python -c 'import sys; print "\n".join(sys.path)'
可以让您查看Python模块搜索路径,而无需进入交互式Python环境。 - Joe Blockpython -c'import sys; print("\n".join(sys.path))'
- arudzinska从标准库中尝试使用imp.find_module
>>> import imp
>>> imp.find_module('fontTools')
(None, 'C:\\Python27\\lib\\site-packages\\FontTools\\fontTools', ('', '', 5))
>>> imp.find_module('datetime')
(None, 'datetime', ('', '', 6))
apt-get remove
删除了 DataDog,但仍然可以导入它。这帮助我找到文件在哪里(以便我可以删除它们),而其他解决方案没有帮助。 - s gimp
包已被弃用(自3.4版本起),建议使用importlib
(自3.1版本起)。详见https://docs.python.org/3.6/library/imp.html。 - michaelimportlib
,然后使用importlib.util.find_spec('fontTools')
。 - Medhatpython -m pip show xxx
只显示已通过pip安装的模块。确认imp
已被弃用,并“计划在Python 3.12中删除”。 - mike rodentdatetime
是Python内置模块,因此没有(Python)源文件。
对于来自.py
(或.pyc
)文件的模块,您可以使用mymodule.__file__
,例如:
> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python -
设置别名:
alias getpmpath="echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python - "
使用方法:
$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc
echo 'import sys; t=__import__(sys.argv[1],fromlist=["."]); print(t.__file__)' | python - "$@"
- Metamorphic在Python解释器中,您可以导入特定的模块,然后键入 help(module)。这会提供诸如名称、文件、模块文档、描述等详细信息。
例如:
import os
help(os)
Help on module os:
NAME
os - OS routines for Mac, NT, or Posix depending on what system we're on.
FILE
/usr/lib/python2.6/os.py
MODULE DOCS
http://docs.python.org/library/os
DESCRIPTION
This exports:
- all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.
- os.path is one of the modules posixpath, or ntpath
- os.name is 'posix', 'nt', 'os2', 'ce' or 'riscos'
et al
:等人,常用于引用文献而不列举所有作者的情况。在Windows上,您可以按照以下方式找到Python模块的位置,例如查找rest_framework模块: