Python2.7を搭載したWindows7では、パスがシンボリックリンクであるかどうかをどのように検出できますか?これは機能しませんos.path.islink()
。falseまたはサポートされていない場合はfalseを返し、提供しているパスは間違いなくシンボリックリンクであるため、Windowsではサポートされていないと思いますか?私に何ができる?
5 に答える
根本的な問題は、古いバージョンのPythonを使用していることです。2.xを使い続けたい場合は、2010年初頭以降に追加された新機能を利用できなくなります。
それらの機能の1つは、NTFSシンボリックリンクの処理です。この機能は2010年後半に3.2で追加されました(詳細については、 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ドキュメントを変更して、常にWindowsでislink
返されることを明確にすることです。False
したがって、WindowsでNTFSシンボリックリンクを読み取りたい場合は、Python 3.2以降にアップグレードするか、、などを使用win32api
しctypes
て自分で読み取る必要があります。
または、Martijn Pietersが示唆しているように、自分で行うのではなく、そのようなサードパーティのライブラリを使用するjaraco.windows
か、コードを借用します。
または、本当に必要な場合は、3.2ソースからコードを借用し、その周りにC拡張モジュールを構築します。ntpath
toからos
to nt
(実際には)までたどるposixmodule.c
と、その根性はとにあると思いwin32_xstat_impl
ますwin32_xstat_impl_w
。
これは、ファイルまたはディレクトリがWindows7のリンクであるかどうかを判断するために使用することになったものです。
from subprocess import check_output, CalledProcessError
import os.path
import ctypes
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
編集:ZitraxとAnnanの提案に従ってコードを変更
編集:shiokoの提案に従ってインクルードステートメントを追加しました
ディレクトリの場合:
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):
pywin32モジュールを使用することもできます。サブモジュールとモジュールでGetFileAttributes
使用できます。たとえば、特定のパスがディレクトリへのシンボリックリンクであるかどうかをテストするには、コードは次のようになります。win32api
FILE_ATTRIBUTE_REPARSE_POINT
win32con
import os
import win32api
import win32con
def is_directory_symlink(path):
return bool(os.path.isdir(path)
and (win32api.GetFileAttributes(path) &
win32con.FILE_ATTRIBUTE_REPARSE_POINT))
Python 2を使用していて、パスにASCII以外の文字が含まれている可能性がある場合GetFileAttributes
は、Unicode文字列が必要です。ただし、単純に使用unicode(path)
すると、通常は失敗します。がであるかどうかをテストし、そうである場合path
は、str
そのdecode
メソッドを使用する必要があります。
if file[-4:len(file)] != ".lnk":
私のために作品を使うだけ