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

  • subprocess.Popen с помощью пути unicode
  • Многопроцессорный выход отличается от Linux и Windows - почему?
  • Не удается дважды запустить KeyboardInterrupt в командной строке?
  • Python: Как я могу сделать escape-коды ANSI работать и в Windows?
  • Установка Python GTK
  • Как получить список каталогов, отсортированный по дате создания в python?
  • Не удается найти lpython2.7
  • Windows Tensorflow с Python не может читать данные mnist из-за разрешений
  • Python - лучший язык программирования в мире.