【发布时间】:2010-09-21 03:39:22
【问题描述】:
如何了解给定 Python 模块的源文件的安装位置? Windows 上的方法与 Linux 上的方法不同吗?
我正在尝试寻找 datetime 模块的来源,但我也对更一般的答案感兴趣。
【问题讨论】:
如何了解给定 Python 模块的源文件的安装位置? Windows 上的方法与 Linux 上的方法不同吗?
我正在尝试寻找 datetime 模块的来源,但我也对更一般的答案感兴趣。
【问题讨论】:
sys.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 -c 'import sys; print("\n".join(sys.path))'
从命令行运行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 是什么!
【讨论】:
built-in 模块在哪里?
datetime 是一个内置模块,所以没有(Python)源文件。
对于来自.py(或.pyc)文件的模块,您可以使用mymodule.__file__,例如
> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
【讨论】:
并非所有的 Python 模块都是用 Python 编写的。 Datetime 恰好是其中之一,并且(在 linux 上)是 datetime.so。
您必须将源代码下载到 python 标准库才能使用它。
【讨论】:
对于纯 python 模块,您可以通过查看 themodule.__file__ 找到源代码。
但是,datetime 模块是用 C 编写的,因此 datetime.__file__ 指向一个 .so 文件(在 Windows 上没有 datetime.__file__),因此您看不到源代码。
如果您下载 python 源 tarball 并解压,模块的代码可以在 Modules 子目录中找到。
例如,如果你想找到python 2.6的日期时间代码,你可以看看
Python-2.6/Modules/datetimemodule.c
您还可以在网上找到最新的 Mercurial 版本,网址为 https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c
【讨论】:
查看此nifty "cdp" command 以 cd 到包含指定 Python 模块源代码的目录:
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
【讨论】:
Python 3.2 中的新功能,您现在可以使用例如code_info() 来自 dis 模块:
http://docs.python.org/dev/whatsnew/3.2.html#dis
【讨论】:
在 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'
等
【讨论】:
我意识到这个答案晚了 4 年,但现有的答案会误导人们。
做到这一点的正确方法永远不是__file__,或者尝试通过sys.path 搜索自己等(除非您需要向后兼容2.1 之后的版本)。
它是inspect 模块,特别是getfile 或getsourcefile。
除非您想学习和实施将.pyc 映射到.py 文件的规则(对于 CPython 2.x,这些规则已记录在案,但很痛苦,而对于其他实现或 3.x 则根本没有记录) ;处理 .zip 档案、egg 和模块包;尝试不同的方法来获取不支持__file__ 的.so/.pyd 文件的路径;弄清楚 Jython/IronPython/PyPy 做了什么;等等。在这种情况下,去吧。
同时,从 2.0+ 开始的每个 Python 版本的源代码都可以通过 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__ 不适用于非内置函数?我知道在哪里爬 sys.path 会很痛苦(尤其是在不了解 meta_path 的情况下),但是您是否担心 __file__ 定义和二进制文件之间的命名空间?
这是获取模块文件名的单行代码,适用于 shell 别名:
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 - "$@"
从标准库尝试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'd DataDog 并且仍然可以导入它。当其他解决方案没有帮助时,这有助于我找到文件的位置(以便我可以删除它们)。
imp 包已被弃用(自 3.4 版起),取而代之的是 importlib(自 3.1 版起)docs.python.org/3.6/library/imp.html
import importlib 然后importlib.util.find_spec('fontTools')
在windows上你可以找到python模块的位置,如下图所示:即找到rest_framework模块
【讨论】:
对于那些喜欢 GUI 解决方案的人:如果您使用诸如 Spyder(Anaconda 安装的一部分)之类的 gui,您只需右键单击模块名称(例如“import csv”中的“csv”)并选择“转到定义” - 这将打开文件,而且在顶部您还可以看到确切的文件位置(“C:....csv.py”)
【讨论】:
如果您使用 pip 安装模块,则只需返回 pip show $module 位置。
【讨论】:
$module 是一个占位符变量,而不是字面上的类型。例如,m=numpy; pip show $m ...等,对于任何m)
pip可能与python中调用的不是同一个。相反,您应该使用python -m pip show $module。见umesh's answer。
在 Ubuntu 12.04 上,例如 python2 的 numpy 包,可以在以下位置找到:
/usr/lib/python2.7/dist-packages/numpy
当然,这不是通用答案
【讨论】:
如果你没有使用解释器,那么你可以运行下面的代码:
import site
print (site.getsitepackages())
输出:
['C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']
Array 中的第二个元素将是您的包裹位置。在这种情况下:
C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages
【讨论】:
在像 Spyder 这样的 IDE 中,导入模块,然后单独运行模块。 enter image description here
【讨论】:
str() 更准确地描述了您在屏幕截图中所做的事情,而且 IDE 似乎与此解决方案无关
从终端检查您是否安装了多个 python 版本的另一种方法。
$ python3 -m pip show pyperclip
位置:/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-
$ python -m pip show pyperclip
位置:/Users/umeshvuyyuru/Library/Python/2.7/lib/python/site-packages
【讨论】:
只是更新答案以防万一现在有人需要它,我在 Python 3.9 并使用 Pip 来管理包。只需使用pip show,例如:
pip show numpy
它将为您提供所有详细信息以及 pip 存储所有其他包的位置。
【讨论】: