Подставить каталог скрипта в строку - PullRequest
4 голосов
/ 04 июля 2011

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

Нечто подобное работает нормально, если определено в том же файле, из которого вы его используете:

from os.path import abspath, dirname, join

def prepend_script_directory(s):
    here = dirname(abspath(__file__))
    return join(here, s)

Не желательно копировать, вставлять или переписывать эту же функцию в каждый модуль, но есть проблема: если вы переместите ее в отдельную библиотеку и импортируете как функцию, __file__ теперь ссылается на какой-то другой модуль и результаты неверны.

Возможно, мы могли бы использовать это вместо этого, но кажется, что sys.argv также может быть ненадежным.

def prepend_script_directory(s):
    here = dirname(abspath(sys.argv[0]))
    return join(here, s)

Как правильно написать prepend_script_directory Надежно и правильно?

Ответы [ 3 ]

4 голосов
/ 04 июля 2011

Лично я бы просто os.chdir входил в каталог скрипта всякий раз, когда выполняю его.Это просто:

import os
os.chdir(os.path.split(__file__)[0])

Однако, если вы действительно хотите преобразовать эту вещь в библиотеку, вы, по сути, хотите функцию, которая знает о состоянии своего вызывающего.Таким образом, вам нужно сделать это

prepend_script_directory(__file__, blah)

Если вы просто хотите написать

prepend_script_directory(blah)

, вам придется делать специфичные для cpython трюки со стековыми фреймами:

import inspect

def getCallerModule():
    # gets globals of module called from, and prints out __file__ global
    print(inspect.currentframe().f_back.f_globals['__file__'])
0 голосов
/ 04 июля 2011

Вы хотите pkg_resources

import pkg_resources
foo_fname = pkg_resources.resource_filename(__name__, "foo.txt")
0 голосов
/ 04 июля 2011

Я думаю, причина этого не в том, что $PYTHONPATH (или sys.path) - это правильный общий механизм для использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...