Python中类似于Unix的'which'命令

6
在*nix系统中,可以使用which命令来查找命令的完整路径。例如:
$ which python
/usr/bin/python

或者使用whereis命令来显示给定命令的所有可能位置。

$ whereis python
python: /bin/python.exe /bin/python2.5-config /usr/bin/python.exe /usr/bin/python2.5-config /lib/python2.4 /lib/python2.5 /usr/lib/python2.4 /usr/lib/python2.5 /usr/include/python2.4 /usr/include/python2.5 /usr/share/man/man1/python.1

有没有一种简单的方法可以找出PYTHONPATH中模块的位置。类似于以下内容:
>>> which (sys)
'c:\\Python25\Lib\site-packages'
2个回答

5

如果您执行以下操作:

modulename.__file__

您将获得该模块的完整路径返回。例如,导入django:

>>>> import django
>>> django.__file__
'/home/bartek/.virtualenvs/safetyville/lib/python2.6/site-packages/django/__init__.pyc'

编辑:如果您还没有机会,请查看下面的评论以获取一些有见地的建议。

我建议查看下面的评论,如果您还没有机会,可以了解一些有见地的见解。

2
每个模块都有__file__属性吗?例如: >>> import sys >>> sys.__file__ Traceback (most recent call last): File "", line 1, in AttributeError: 'module' object has no attribute '__file__' >>> import os >>> os.__file__ 'C:\\Python25\\lib\\os.pyc' - Boris Gorelik
+1 尽管这似乎对 OP 示例中的 sys 无效。 - Mike Dinsdale
3
它对sys无效,因为sys根本不来自文件:它是一个内置模块。因此,对于which(sys)没有明智的答案。 - bobince

1
这有点笨拙,但你可以键入python pywhich os django PIL
import os, os.path
import sys

def pywhich(mod):
    for p in sys.path:
        try:
            if any(p.startswith(mod + '.py') for p in os.listdir(p)):
                return os.path.join(p, mod)
        except OSError:
            pass
    return "Not found"

if __name__ == '__main__':
    for arg in sys.argv[1:]:
        print arg, pywhich(arg)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接