Как получить путь модуля? - PullRequest
       45

Как получить путь модуля?

628 голосов
/ 29 октября 2008

Я хочу определить, изменился ли модуль. Теперь использовать inotify просто, вам просто нужно знать каталог, из которого вы хотите получать уведомления.

Как мне получить путь к модулю в Python?

Ответы [ 17 ]

4 голосов
/ 29 августа 2018

вы можете просто импортировать свой модуль затем нажмите его имя, и вы получите его полный путь

>>> import os
>>> os
<module 'os' from 'C:\\Users\\Hassan Ashraf\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\os.py'>
>>>
3 голосов
/ 22 апреля 2018

Я хотел бы внести свой вклад в один общий сценарий (в Python 3) и изучить несколько подходов к нему.

Встроенная функция open () принимает в качестве первого аргумента относительный или абсолютный путь. Относительный путь обрабатывается как относительно текущего рабочего каталога , поэтому рекомендуется передавать абсолютный путь к файлу.

Проще говоря, если вы запустите файл сценария со следующим кодом, то не гарантирует, что файл example.txt будет создан в том же каталоге, где находится файл сценария:

with open('example.txt', 'w'):
    pass

Чтобы исправить этот код, нам нужно получить путь к сценарию и сделать его абсолютным. Чтобы обеспечить абсолютный путь, мы просто используем функцию os.path.realpath () . Чтобы получить путь к сценарию, есть несколько общих функций, которые возвращают различные результаты пути:

  • os.getcwd()
  • os.path.realpath('example.txt')
  • sys.argv[0]
  • __file__

Обе функции os.getcwd () и os.path.realpath () возвращают результаты пути на основе текущего рабочего каталога . Вообще не то, что мы хотим. Первым элементом списка sys.argv является путь корневого сценария (выполняемый сценарий) независимо от того, вызываете ли вы список в самом корневом сценарии или в любом из его модули. Это может пригодиться в некоторых ситуациях. Переменная __ file __ содержит путь к модулю, из которого она была вызвана.


Следующий код правильно создает файл example.txt в том же каталоге, где находится скрипт:

filedir = os.path.dirname(os.path.realpath(__file__))
filepath = os.path.join(filedir, 'example.txt')

with open(filepath, 'w'):
    pass
3 голосов
/ 15 августа 2014

Если единственное предостережение при использовании __file__ - это когда текущий относительный каталог пуст (т. Е. При запуске в качестве скрипта из того же каталога, где находится скрипт), тогда тривиальное решение:

import os.path
mydir = os.path.dirname(__file__) or '.'
full  = os.path.abspath(mydir)
print __file__, mydir, full

И результат:

$ python teste.py 
teste.py . /home/user/work/teste

Хитрость в or '.' после вызова dirname(). Он устанавливает каталог как ., что означает текущий каталог и является допустимым каталогом для любой связанной с путем функции.

Таким образом, использование abspath() не является действительно необходимым. Но если вы используете его в любом случае, хитрость не нужна: abspath() принимает пустые пути и правильно интерпретирует его как текущий каталог.

1 голос
/ 06 октября 2018

Если вы хотите узнать абсолютный путь из вашего скрипта, вы можете использовать Путь объект:

from pathlib import Path

print(Path().absolute())
print(Path().resolve('.'))
print(Path().cwd())

метод cwd ()

Возвращает новый объект пути, представляющий текущий каталог (как возвращается os.getcwd ())

метод resol ()

Сделать путь абсолютным, разрешив любые символические ссылки. Возвращается новый объект пути:

1 голос
/ 12 мая 2015

Из модулей пакета python мне нужно было сослаться на файл, который находился в том же каталоге, что и пакет. Ex.

some_dir/
  maincli.py
  top_package/
    __init__.py
    level_one_a/
      __init__.py
      my_lib_a.py
      level_two/
        __init__.py
        hello_world.py
    level_one_b/
      __init__.py
      my_lib_b.py

Итак, выше я должен был вызвать maincli.py из модуля my_lib_a.py, зная, что top_package и maincli.py находятся в одном каталоге. Вот как я могу получить путь к maincli.py:

import sys
import os
import imp


class ConfigurationException(Exception):
    pass


# inside of my_lib_a.py
def get_maincli_path():
    maincli_path = os.path.abspath(imp.find_module('maincli')[1])
    # top_package = __package__.split('.')[0]
    # mod = sys.modules.get(top_package)
    # modfile = mod.__file__
    # pkg_in_dir = os.path.dirname(os.path.dirname(os.path.abspath(modfile)))
    # maincli_path = os.path.join(pkg_in_dir, 'maincli.py')

    if not os.path.exists(maincli_path):
        err_msg = 'This script expects that "maincli.py" be installed to the '\
        'same directory: "{0}"'.format(maincli_path)
        raise ConfigurationException(err_msg)

    return maincli_path

На основании публикации в PlasmaBinturong я изменил код.

1 голос
/ 14 января 2015

Если вы хотите сделать это динамически в «программе», попробуйте следующий код:
Я хочу сказать, что вы можете не знать точное название модуля, чтобы «жестко» его кодировать. Он может быть выбран из списка или может не работать в данный момент для использования __file __.

(я знаю, это не будет работать в Python 3)

global modpath
modname = 'os' #This can be any module name on the fly
#Create a file called "modname.py"
f=open("modname.py","w")
f.write("import "+modname+"\n")
f.write("modpath = "+modname+"\n")
f.close()
#Call the file with execfile()
execfile('modname.py')
print modpath
<module 'os' from 'C:\Python27\lib\os.pyc'>

Я пытался избавиться от "глобальной" проблемы, но нашел случаи, когда она не работала Я думаю, что "execfile ()" можно эмулировать в Python 3 Поскольку это в программе, его можно легко поместить в метод или модуль для повторного использования.

0 голосов
/ 01 апреля 2019

Если вы хотите получить корневой путь пакета из любого из его модулей, работает следующее (протестировано на Python 3.6):

from . import __path__ as ROOT_PATH
print(ROOT_PATH)

На основной __init__.py путь также можно ссылаться, используя вместо него __file__.

Надеюсь, это поможет!

...