os.path.islink на windows с python

В Windows 7 с Python 2.7 как я могу определить, является ли путь символической ссылкой? Это не работает os.path.islink() , он говорит, что возвращает false, если false или не поддерживается, и путь, который я предоставляю, определенно является символической ссылкой, поэтому я предполагаю, что она не поддерживается в Windows? Что я могу сделать?

3 Solutions collect form web for “os.path.islink на windows с python”

Коренная проблема заключается в том, что вы используете слишком старую версию Python. Если вы хотите придерживаться 2.x, вы не сможете воспользоваться новыми функциями, добавленными после начала 2010 года.

Одной из этих функций является обработка символических ссылок NTFS. Эта функциональность была добавлена ​​в 3.2 в конце 2010 года (подробности см. В источниках 3.2 , 3.1 и 2.7 ).

Причина, по которой Python не обрабатывала символические ссылки NTFS до этого времени, заключается в том, что до конца 2009 года такой операции не было. (IIRC, поддержка была включена в ядро ​​6.0, но для поддержки пользовательской лицензии требуется пакет обновления для Vista / 2008, только 7 / 2008R2 и более новый, с его встроенным интерфейсом. Кроме того, для доступа к этой пользовательской поддержке необходим новый достаточно MSVCRT, и у Python есть явная политика не обновления до новых версий Visual Studio в рамках небольшой версии.)

Причина, по которой код не был перенесен обратно в 2.x, заключается в том, что никогда не будет 2.8 , а исправления ошибок, такие как 2.7.3 (или 2.7.4), не будут получать новые функции, только исправления ошибок.

Об этом сообщается как проблема 13143 , и предполагаемое исправление заключается в изменении 2.7 документов, чтобы уточнить, что islink всегда возвращает False в Windows.

Итак, если вы хотите читать символические ссылки NTFS под Windows, либо обновляйтесь до Python 3.2+, либо вам нужно использовать win32api , ctypes и т. Д., Чтобы сделать это самостоятельно.

Или, как предполагает Мартийн Питерс, вместо того, чтобы делать это самостоятельно, используйте стороннюю библиотеку, такую ​​как jaraco.windows которая делает это и / или заимствует свой код .

Или, если вы действительно хотите, заимствуйте код из источника 3.2 и создайте модуль расширения C вокруг него. Если вы проследите от ntpath до os до nt (что на самом деле posixmodule.c ), я считаю, что его кишки находятся в win32_xstat_impl и win32_xstat_impl_w .

Для каталогов:

 import os, ctypes def IsSymlink(path): FILE_ATTRIBUTE_REPARSE_POINT = 0x0400 return os.path.isdir(path) and (ctypes.windll.kernel32.GetFileAttributesW(unicode(path)) & FILE_ATTRIBUTE_REPARSE_POINT): 

Источник

Это то, что я в конечном итоге использовал, чтобы определить, является ли файл или каталог ссылкой в ​​Windows 7:

 def isLink(path): if os.path.exists(path): if os.path.isdir(path): FILE_ATTRIBUTE_REPARSE_POINT = 0x0400 attributes = ctypes.windll.kernel32.GetFileAttributesW(unicode(path)) return (attributes & FILE_ATTRIBUTE_REPARSE_POINT) > 0 else: command = ['dir', path] try: with open(os.devnull, 'w') as NULL_FILE: o0 = check_output(command, stderr=NULL_FILE, shell=True) except CalledProcessError as e: print e.output return False o1 = [s.strip() for s in o0.split('\n')] if len(o1) < 6: return False else: return 'SYMLINK' in o1[5] else: return False 

EDIT: Измененный код в соответствии с предложениями Zitrax и Annan

  • Обработка \ r \ n vs \ n новых строк в python на Mac и Windows
  • Большой файл не сбрасывается на диск сразу после вызова close ()?
  • Ошибка pycurl https: не удалось получить сертификат локального эмитента
  • Библиотека PIL и JPEG в Windows
  • Установка проблемы Pylint с окнами и python 3.2
  • Как запустить скрипт python с повышенными привилегиями на окнах
  • ImportError: Ошибка загрузки DLL при импорте win32clipboard в приложение, замороженное cx_Freeze
  • <Python> Ошибка установки OpenPIV
  • Как установить майави на Windows для python 3 через conda?
  • Кросс-платформенное пространство, оставшееся на томе с использованием python
  • Как отобразить utf-8 в консоли Windows
  • Python - лучший язык программирования в мире.