2012-04-16 2 views
23

Допустим, у вас есть модуль, который содержитсделать путь «всегда относительно текущего модуля»?

myfile = open('test.txt', 'r') 

И файл «test.txt» находится в той же папке. Если вы запустите модуль, файл будет успешно открыт. Теперь можно сказать, что вы импортируете этот модуль из другого, находящегося в другой папке. Файл не будет искать в той же папке, что и модуль, в котором находится этот код. Итак, как сделать сначала поиск файлов с относительными путями в одной папке? Существуют различные решения с использованием «__file__» или «os.getcwd()», но я надеюсь, что есть более чистый способ, такой же специальный символ в строке, которую вы передаете open() или file().

+0

В чем проблема с 'os.getcwd()'? – cfedermann

+1

'os.getcwd()' возвращает путь первого модуля, который импортировал этот модуль, или импортировал другой, который импортировал его. Первый модуль может находиться во многих каталогах вверх или вниз. Так что не очень элегантно набирать 'os.getcwd() + 'something/somethingelse/yetanother/finallyhere'' –

+1

Ну, тогда попробуйте предложенный ответ' sys.modules' ниже :) – cfedermann

ответ

31

Решение использовать __file__ и это довольно чистый:

import os 

TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt') 
+0

+1, действительно! Вы можете даже просто «импортировать os.path». – Emmanuel

+0

'import os.path' бессмысленно, когда вы импортируете os', модуль импортирует' os.path' для вас ('os' является специальным способом). Можно использовать 'from os путь импорта ', но это не часто встречается в случае модуля' os'. Очень вероятно, что у него уже есть 'import os' в его модуле или он скоро понадобится. Поэтому 'import os' почти всегда является лучшим выбором. – yak

+0

Я думаю, это так же чисто, как вы можете получить. Что-нибудь еще попросит изменить, как работает официальный интерпретатор Python. –