2014-01-16 3 views
1

У меня есть сценарий, B.py, который импортируется из другого сценария, скажет A.pyКак мне получить путь к скрипту python с правильным случаем?

Если я импортировать B в A, то __file__ магической константы, преобразовала некоторые прописные буквы в пути к нижнему регистру.

Если я запускаю файл B напрямую, константа __file__ имеет правильный случай касательно пути.

Короче говоря, это то, что происходит. Следующее:

telplugins_path = os.path.dirname(os.path.realpath(__file__)) 

дать мне этот путь

C:\\Python\\lib\\site_packages\\mypackage 

, когда он должен быть

C:\\Python\\Lib\\site_packages\\mypackage 

Обратите внимание на изменения на 'Lib' -> 'Lib'

У кого-нибудь есть идея о том, как получить путь к __file__ с надлежащим случаем? Запуск этого в Windows.

+0

Почему вы считаете, что это дает вам неправильный случай? –

+0

Я не верю. Это то, что происходит. –

+0

Странно ... Я думаю, что в Windows вы должны иметь доступ к пути, независимо от случая. – Rico

ответ

3

Файловая система Windows не чувствительна к регистру.

Python только что сконфигурирован с помощью пути C:\Python\lib\site_packages в списке поиска sys.path, поэтому при импорте модуля python создает путь к файлу в нижней строке.

Это не проблема. Windows продолжит загружать файлы, используя нижнюю версию пути.

+0

Это проблема для меня. Путь передается модулю C++ нижнего уровня, который проверяет, существует ли папка. Поскольку у него неправильный случай, он возвращается, говоря, что его не существует! Мне нужно решение, которое дает правильный путь, с правильным случаем. Ваш ответ не предусматривает этого, и поэтому не является правильным ответом. –

+1

@TotteKarlsson: Тогда этот модуль C++ использует неправильный API для проверки существования папки! –

+1

@TotteKarlsson: у Python есть функция '' os.path.normcase() '(http://docs.python.org/2/library/os.path.html#os.path.normcase), которая будет * в нижнем регистре * путь, включая начальный 'P' для' Python', который может оставить вас хуже. –

1

В окнах модуль win32 содержит функцию GetLongPathName. Он решает вышеуказанную проблему.

То есть, следующий дает путь с правильным случае:

aFile = win32api.GetLongPathName(__file__) 
pathWithCorrectCase = os.path.split(aFile)[0] 

Однако, я хотел бы избежать с помощью модуля win32, так как он, кажется, не совсем «стандартный».

+0

он не будет работать с частями имени файла/файла более 8 символов – kxr

0

Урожайность через стандартную библиотеку:

cased_path = glob.glob(re.sub(r'([^:])(?=[/\\]|$)', r'[\1]', __file__))[0] 
0

Есть определенные вызовы можно сделать на окнах, которые выходят из строя с неправильным корпусом. Существуют также сценарии, такие как мои, где эти вызовы отправляются машиной, которая чувствительна к регистру.

В любом случае, если вам нужна надлежащая обсадка на окнах, это лучшее решение, которое я нашел.

Для отдельных файлов, его достаточно легко listdir, но если у вас есть путь к каталогу, что вы не положительны правильно обсаженные:

import win32com.client as com 
_dir = <your path> 
fso = com.Dispat("Scripting.FileSystemObject") 
folder = fso.GetFolder(_dir) 
path = folder.path 

Это вернет правильно упакованный путь.

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