Answers:
对于纯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
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在我的装置上!
built-in
模块在哪里?
我知道这个答案要晚4年了,但是现有的答案会误导人们。
做到这一点的正确方法永远不会__file__
,或者尝试逐步完成sys.path
搜索并寻找自己,等等(除非您需要向后兼容2.1以上)。
这是inspect
模块特别getfile
或getsourcefile
。
除非您想学习和实现用于映射.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.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__
不适用于非buildins?我知道在哪里爬sys.path会很痛苦(尤其是在不了解meta_path的情况下),但是您是否担心__file__
定义和二进制文件之间的命名空间?
__file__
工作,都inspect.getfile
可以;在任何情况下,__file__
都不会比仅使用检查模块更好地猜测是否使用。
的 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))'
从标准库尝试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,仍然可以导入它。当其他解决方案无济于事时,这可以帮助我找到文件的位置(以便删除它们)。
import importlib
然后importlib.util.find_spec('fontTools')
在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'
等
这是获取模块文件名的一种方法,适用于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
Python 3.2中的新功能,您现在可以code_info()
在dis模块中使用例如:http :
//docs.python.org/dev/whatsnew/3.2.html#dis
签出这个漂亮的“ cdp”命令以cd到包含指示的Python模块源的目录:
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
如果您不使用解释器,则可以运行以下代码:
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