python os.path.realpath не работает должным образом - PullRequest
5 голосов
/ 27 марта 2012

У меня есть следующий код:

os.chdir(os.path.dirname(os.path.realpath(__file__)) + "/../test")
path.append(os.getcwd())
os.chdir(os.path.dirname(os.path.realpath(__file__)))

Который должен добавить /../test к пути Python, и это так, и все это впоследствии проходит гладко при затмении с использованием PyDev.

Но когда я запускаю одно и то же приложение из консоли второй, os.chdir что-то делает не так, на самом деле неправильная вещь в os.path.realpath(__file__), потому что она возвращает ../test/myFile.py вместо ../originalFolder/myFile.py.Конечно, я могу исправить это, используя исправленный os.chdir("../originalFolder"), но мне это кажется немного неправильным, но это работает как на eclipse, так и на консоли.

PS Я на самом деле использую os.getcwd(), потому что хочуубедитесь, что такая папка еще не добавлена, иначе мне вообще не пришлось бы переключать каталоги

Итак, что-то не так с моим подходом или я что-то испортил?или что?:)

Заранее спасибо!:)

1 Ответ

6 голосов
/ 27 марта 2012

Посмотрите, каково значение __file__. Он не содержит абсолютного пути к вашему сценарию, это значение из командной строки, поэтому это может быть что-то вроде «./myFile.py» или «myFile.py». Кроме того, realpath () не делает путь абсолютным, поэтому realpath ("myFile.py"), вызываемый в другом каталоге, будет по-прежнему возвращать "myFile.py".

Я думаю, вы должны сделать что-то вроде этого:

import os.path

script_dir = os.path.dirname(os.path.abspath(__file__))
target_dir = os.path.join(script_dir, '..', 'test')
print(os.getcwd())
os.chdir(target_dir)
print(os.getcwd())
os.chdir(script_dir)
print(os.getcwd())

На моем компьютере (Windows) результат такой:

e:\parser>c:\Python27\python.exe .\rp.py
e:\parser
e:\test
e:\parser

e:\parser>c:\Python27\python.exe ..\parser\rp.py
e:\parser
e:\test
e:\parser

Примечание: Если вам нужна совместимость (вам не нравятся странные ошибки пути), вам следует использовать os.path.join () всякий раз, когда вы объединяете пути.

Примечание: Я знаю, что мое решение очень простое (помните абсолютный путь), но иногда простейшие решения являются лучшими.

...