如何找到Python模块源的位置?


478

如何了解给定Python模块的源文件的安装位置?Windows和Linux上的方法是否不同?

我正在寻找来源 datetime模块,但我也对更通用的答案感兴趣。

Answers:


375

对于纯python模块,您可以通过查看来找到源themodule.__file__。但是,datetime模块是用C编写的,因此datetime.__file__指向.so文件(datetime.__file__在Windows中没有),因此看不到源代码。

如果您下载python源tarball并将其解压缩,则可以在模块中找到模块的代码子目录中。

例如,如果要查找python 2.6的日期时间代码,可以查看

Python-2.6/Modules/datetimemodule.c

您也可以在以下网址找到最新的Mercurial版本: https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c


如果您编辑答案以指示datetime .__ file__指向Linux和Mac OS X上的.so(尽管Windows上的datetime模块对象没有文件属性),我将接受您的答案。
达里尔·斯皮策

实际上在Windows上(至少在我使用的版本上),datetime只是没有文件属性。
达里尔·斯皮策

220

python -v从命令行运行应该告诉您正在导入什么以及从何处导入。这适用于Windows和Mac OSX。

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在我的装置上!


8
凉!在交互式模式下打开它之后,您也可以键入自己的特定导入语句,以查看特定库的来源。
scorpiodawg

3
built-in模块在哪里?
loretoparisi 2016年

120

我知道这个答案要晚4年了,但是现有的答案会误导人们。

做到这一点的正确方法永远不会__file__,或者尝试逐步完成sys.path搜索并寻找自己,等等(除非您需要向后兼容2.1以上)。

这是inspect模块特别getfilegetsourcefile

除非您想学习和实现用于映射.pyc.py文件的规则(对于CPython 2.x,已记录但很痛苦,而对于其他实现或3.x则没有任何记录);处理.zip归档文件,鸡蛋和模块包;尝试不同的方法以获取.so/.pyd不支持的文件__file__ ; 弄清楚Jython / IronPython / PyPy的作用;等。在这种情况下,请继续努力。

同时,每个Python版本的2.0 或更高版本的源均可在线获得http://hg.python.org/cpython/file/X.Y/(例如2.73.3)。因此,一旦发现inspect.getfile(datetime).so或之类的.pyd文件/usr/local/lib/python2.7/lib-dynload/datetime.so,就可以在Modules目录中查找它。严格来说,无法确定哪个文件定义了哪个模块,但是几乎所有文件都不是foo.cfoomodule.c,因此不难猜测datetimemodule.c是您想要的。


3
为什么__file__不适用于非buildins?我知道在哪里爬sys.path会很痛苦(尤其是在不了解meta_path的情况下),但是您是否担心__file__定义和二进制文件之间的命名空间?

1
我在日期时间的2.​​7.8中执行此操作,并且只为getfile和getsourcefile都收到TypeError。我个人安装了多个版本的python,我需要知道它所指向的datetimemodule.c的哪个版本,因为现在我知道它没有指向一个,因为给定的解释器版本正在运行...
mmitchell

1
@mmitchell:如果您从inspect.getfile(datetime)收到TypeError,假设datetime实际上是模块,而不是您已分配给相同名称的其他东西,那么我敢肯定,这意味着您进行了自定义构建在日期时间中静态链接到解释器,而不是使其成为可加载模块。但是可能还有其他我没有想到的原因。您需要提出一个新问题,并提供更多信息来重现此问题。
abarnert 2015年

@mmitchell:同时,无法找到它指向的datetimemodule.c版本,因为它没有指向datetimemodule.c,而是指向了从该C文件构建的编译模块。C文件可能在您的系统上不存在,或者自编译以来就已经进行了编辑。
abarnert 2015年

@tristan:我不确定我是否理解您的要求,但是也许这会回答:无论何时__file__工作,都inspect.getfile可以;在任何情况下,__file__都不会比仅使用检查模块更好地猜测是否使用。
abarnert 2015年

67

sys.path列表包含将在运行时搜索模块的目录列表:

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]

10
python -c 'import sys; print "\n".join(sys.path)'将让您查看它,而不必放入交互式python。

6
Python 3:python -c 'import sys; print("\n".join(sys.path))'
arudzinska


37

从标准库尝试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))

1
这是太棒了。我apt-get remove选择了DataDog,仍然可以导入它。当其他解决方案无济于事时,这可以帮助我找到文件的位置(以便删除它们)。
2015年

对于python3.x,imp不推荐使用该软件包(自3.4版开始),而推荐使用(importlib自3.1 版起)docs.python.org/3.6/library/imp.html
michael

现在,您需要以这种方式将其用于python3。import importlib然后importlib.util.find_spec('fontTools')
Medhat

33

datetime 是一个内置模块,因此没有(Python)源文件。

对于来自.py(或.pyc)文件的模块,可以使用mymodule.__file__,例如

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'

12

在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'


这给了我完整的模块文件路径,而其他答案仅给出了相对路径。谢谢。
Jerther

12

这是获取模块文件名的一种方法,适用于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



9

在Windows上,您可以找到python模块的位置,如下所示:ie find rest_framework模块 在此处输入图片说明


4

在Ubuntu 12.04上,例如可以在以下位置找到python2的numpy软件包:

/usr/lib/python2.7/dist-packages/numpy

当然,这不是通用答案


0

并非所有的python模块都是用python编写的。日期时间恰好是其中之一,并且(在Linux上)是datetime.so。

您必须将源代码下载到python标准库中才能使用它。


2
Daryl:您误解了Jim的回答,“ Datetime恰好是不是用python编写的python模块之一”。
马修·特雷弗

0

对于那些喜欢GUI解决方案的用户:如果使用的是GUI,例如Spyder(Anaconda安装的一部分),则可以右键单击模块名称(例如“ import csv”中的“ csv”),然后选择“ go定义”-这将打开文件,但在顶部您也可以看到确切的文件位置(“ C:.... csv.py”)


0

如果您不使用解释器,则可以运行以下代码:

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

0

从终端检查是否已安装多个python版本的另一种方法。

-MBP:〜python3 -m pip显示pyperclip

位置:/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-

MBP:〜python -m pip show pyperclip

位置:/Users/umeshvuyyuru/Library/Python/2.7/lib/python/site-packages


-1

在Spyder之类的IDE中,导入模块,然后分别运行该模块。 在此处输入图片说明


导入并打印str()模型的内容是您在屏幕快照中所做的操作的更准确描述,此外,IDE对于该解决方案似乎无关紧要
mousetail

2
欢迎来到StackOverflow!请不要使用图片发布代码。图片难以阅读,无法搜索并且某些读者无法查看。相反,请直接在答案正文中包含所有相关代码。
布赖恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.