2010-04-13 2 views
6

В системах * nix можно использовать which, чтобы узнать полный путь к команде. Например:Python analog of Unix 'который'

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

ответ

5

Если вы:

modulename.__file__

Вы получите полный путь возвращения этого точного модуля. Например, импорт Джанго:

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

Edit: Я рекомендую посмотреть комментарии ниже для некоторого хорошего понимания, если вы не имели шанс.

+2

ли он гарантировал, что каждый модуль имеет '__file__' атрибут? , например: ' >>> импорт SYS >>> SYS .__ FILE__ Traceback (самый последний вызов последнего): Файл "", строка 1, в AttributeError: 'модуль' объект не имеет атрибута ' __FILE__» >>> импорт ОС >>> ОС .__ FILE__ 'C: \\ Python25 \\ Lib \\ os.pyc' ' –

+0

+1 Хотя это не похоже на работу для 'sys', как в примере OP –

+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)