我如何了解一个给定的Python模块的源文件安装在哪里?Windows上的方法和Linux上的方法不同吗?

我特别试图寻找datetime模块的源代码,但我对更一般的答案也感兴趣。


sys。Path list包含在运行时搜索模块的目录列表:

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

从命令行运行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
...

我不知道我安装的那些不好的时光网是什么!


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

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

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

并非所有的python模块都是用python编写的。Datetime恰好是其中之一,并且(在linux上)是Datetime。

你必须将源代码下载到python标准库才能得到它。


对于一个纯python模块,你可以通过查看module.__file__找到源代码。 然而,datetime模块是用C语言编写的,因此datetime模块是用C语言编写的。__file__指向一个.so文件(没有datetime. so文件)。__file__在Windows上),因此,你不能看到源代码。

如果你下载一个python源tarball并提取它,模块的代码可以在modules子目录中找到。

例如,如果你想找到python 2.6的datetime代码,你可以查看

Python-2.6/Modules/datetimemodule.c

你也可以在github上找到这个文件的最新版本 https://github.com/python/cpython/blob/main/Modules/_datetimemodule.c


看看这个漂亮的"cdp"命令,cd到包含指定Python模块源代码的目录:

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}

Python 3.2中的新功能,你现在可以使用dis模块中的code_info(): http://docs.python.org/dev/whatsnew/3.2.html#dis


在python解释器中,您可以导入特定的模块,然后键入help(module)。这将提供诸如名称、文件、模块文档、描述等详细信息。

Ex:

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. file__。路径和搜索自己,等等(除非你需要向后兼容超过2.1)。

它是inspect模块——特别是getfile或getsourcefile。

除非你想学习和实现CPython 2的规则(这些规则有文档,但很痛苦)。3.x)用于将.pyc映射到.py文件;处理.zip档案、eggs和模块包;尝试不同的方法得到。so/的路径。不支持__file__的Pyd文件;弄清楚Jython/IronPython/PyPy做什么;等。在这种情况下,放手去做吧。

Meanwhile, every Python version's source from 2.0+ is available online at http://hg.python.org/cpython/file/X.Y/ (e.g., 2.7 or 3.3). So, once you discover that inspect.getfile(datetime) is a .so or .pyd file like /usr/local/lib/python2.7/lib-dynload/datetime.so, you can look it up inside the Modules directory. Strictly speaking, there's no way to be sure of which file defines which module, but nearly all of them are either foo.c or foomodule.c, so it shouldn't be hard to guess that datetimemodule.c is what you want.


下面是一行代码获取模块的文件名,适用于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

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

在windows上,你可以找到python模块的位置,如下所示:E找到rest_framework模块


对于那些更喜欢GUI解决方案的人:如果你正在使用GUI,如Spyder (Anaconda安装的一部分),你可以右键单击模块名称(如“import csv”中的“csv”),并选择“go to definition”-这将打开文件,但在顶部你可以看到确切的文件位置(“C:....csv.py”)


如果使用pip来安装模块,只需返回pip show $module位置。


在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中,导入模块,然后单独运行模块。 在这里输入图像描述


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

$ python3 -m PIP show pyperclip

地点:/图书馆/框架/ Python.framework /版本/ 3.7 / lib / python3.7 /网站

$ python -m PIP show pyperclip

地点:/用户/ umeshvuyyuru /图书馆/ Python / 2.7 / lib / Python /网站


只是更新答案,以防现在有人需要它,我在Python 3.9和使用Pip来管理包。就用pip show,例如:

pip show numpy

它将为您提供所有详细信息,包括pip存储所有其他包的位置。


如上所述 在python中只使用help(模块) 即

进口分数

帮助(分数)

如果你的模块,在例子中的分数,被安装,然后它会告诉你的位置和有关它的信息,如果它没有安装,它说模块不可用

如果它不可用,默认情况下python不会附带,在这种情况下,你可以检查你在哪里找到它的下载信息