2013-03-05 2 views
1

Так что я только что закодировал этот класс для экрана заголовка, и он работает хорошо. Тем не менее, один из людей, с которыми я работаю над проектом отметил, что я не должен использовать:Где python ищет файлы в скрипте?

os.chdir(os.getcwd() + "/..") 

resource = (os.getcwd() + "/media/file name") 

, чтобы добраться до супер каталога. Однако он упомянул что-то о pythonpath. Мы используем Eclipse, если это поможет.

Для получения дополнительной информации мы создаем многоплатформенную игру, поэтому мы не можем просто синхронизировать наши каталоги и жестко программировать ее (хотя мы используем git, поэтому рабочий каталог синхронизируется). В принципе, мне нужно каким-то образом перейти из файла сценария в папку «src» в папку «media», которая находится рядом с ним (AKA. В ней есть супер-проектная папка с папками «src» и «media») .

Любая помощь будет принята с благодарностью, но, пожалуйста, не говорите «google it», потому что я пробовал это, прежде чем приходить сюда (я не знаю, часто ли это здесь, но я видел это слишком много раз в другом месте ... когда я гугл ответов, извините, если я кажусь jerkish утверждать, что)

+0

Я этого не вижу. Я вижу, как мое текущее решение похоже, но это только проблема. Есть способ сделать это, это лучше, чем то, как я это делаю. – ElectricErger

+0

Я думаю, что вопрос заключается не столько в получении родительского каталога, сколько в перемещении в каталог * по отношению к скрипту/программе *, как указано в заголовке. Итак, я думаю, что этот вопрос не является дубликатом http://stackoverflow.com/q/2860153/42973. – EOL

ответ

2

Python есть понятие текущего рабочего каталога, который, как правило, каталог, из которого был запущен скрипт. Это «где они ищут файлы» с относительным путем.

Однако, поскольку ваша программа может быть запустить из другой папки, чем тот, что находится в, ваш каталог ссылок необходимо вместо обратиться к каталог сценарий находится в (текущий каталог не связанные с расположением вашего скрипта в целом). Каталог, в котором находится ваш скрипт получается с

script_dir = os.path.dirname(__file__) 

Обратите внимание, что этот путь может быть относительным (возможно, пустой), так что это еще важно, что текущий рабочий каталог вашего скрипта будет такой же, как в каталоге, когда ваш скрипт был прочитан интерпретатором python (который установлен, когда установлен __file__).Важно, чтобы преобразовать возможно относительное script_dir в абсолютный путь, если текущий рабочий каталог изменяется позже в коде:

# If script_dir is relative, the current working directory is used, here. This is correct if the current 
# working directory is the same as when the script was read by the Python interpreter (which is 
# when __file__ was set): 
script_dir = os.path.abspath(script_dir) 

Вы можете получить в каталог media в родительском каталоге с независимой от платформы

os.path.join(script_dir, os.path.pardir, 'media') 

на самом деле os.path.pardir (или что то же самое os.pardir) является независимой от платформы родительского каталога условности, и os.path.join() просто соединяют пути в платформе независимого способе.

+1

+1 для использования '__file__' и обращения к проблеме' abspath' –

0

Рассмотрите возможность использования os.path.dirname() и os.path.join(). Они должны работать в платформе независимым образом.

+0

Не нужен ли путь для so.path.dirname() и не зависит от платформы? – ElectricErger

+1

Да, вы делаете - используйте 'os.path.dirname (os.path.abspath (__ file __))' – wim

+0

@JimGarrison: Это не будет работать, если сценарий не запущен из каталога, в котором он находится. Вероятно, это один из причины, по которым некоторые люди упомянули, что код в вопросе «не должен использоваться» (не говоря уже о том, что некоторые другие части кода могут изменить текущий рабочий каталог). – EOL

1

Я бы рекомендовал что-то например:

import os.path 

base_folder = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
media_folder = os.path.join(base_folder, "media") 
src_folder = os.path.join(base_folder, "src") 

resource = os.path.join(media_folder, "filename") 

for path in [base_folder, media_folder, src_folder, resource]: 
    print path 

Основными компонентами являются:

  • __file__: получает путь к текущему исходному файлу (в отличие от sys.argv[0], который дает путь к сценарию, который был вызван)
  • os.path.split(): расщепляет путь в соответствующее имя файла/папки и содержащую его базовую папку. Используя его дважды, как в base_folder = ..., вы получите родительский каталог.
  • os.path.join: независимая от ОС и правильная комбинация названий путей. Знает отсутствующими или нескольких / с или \ с программами
+0

-1 потому что это зависит от того, как вызывается файл python. 'os.path.split (__ file __) [0]' может быть пустым в некоторых случаях, нарушая вещи. Также есть уже встроенные способы сделать это (а именно «os.path.dirname'), поэтому предпочитайте использовать их, кроме того, что с помощью' split' – wim

+1

'dirname' то, что я хотел использовать, наверняка. Исправлен ответ, чтобы отразить это. Главным моментом моего ответа является использование '__file__', о котором не упоминалось в более раннем ответе. –

+2

+1, потому что вы правы: '__file__' является лучшим справочным каталогом, так как папка' media' помещается относительно скрипта, а не относительно того, где его запускают пользователи (т. Е. Текущий каталог действительно не так важен). – EOL

Смежные вопросы