12

Python2.7を搭載したWindows7では、パスがシンボリックリンクであるかどうかをどのように検出できますか?これは機能しませんos.path.islink()。falseまたはサポートされていない場合はfalseを返し、提供しているパスは間違いなくシンボリックリンクであるため、Windowsではサポートされていないと思いますか?私に何ができる?

4

5 に答える 5

20

根本的な問題は、古いバージョンの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以降にアップグレードするか、、などを使用win32apictypesて自分で読み取る必要があります。

または、Martijn Pietersが示唆しているように、自分で行うのではなく、そのようなサードパーティのライブラリを使用するjaraco.windows、コードを借用します

または、本当に必要な場合は、3.2ソースからコードを借用し、その周りにC拡張モジュールを構築します。ntpathtoからosto nt(実際には)までたどるposixmodule.cと、その根性はとにあると思いwin32_xstat_implますwin32_xstat_impl_w

于 2013-03-06T22:05:39.963 に答える
7

これは、ファイルまたはディレクトリが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の提案に従ってインクルードステートメントを追加しました

于 2014-11-26T23:51:09.883 に答える
6

ディレクトリの場合:

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):

ソース

于 2016-03-10T11:55:51.867 に答える
2

pywin32モジュールを使用することもできます。サブモジュールとモジュールでGetFileAttributes使用できます。たとえば、特定のパスがディレクトリへのシンボリックリンクであるかどうかをテストするには、コードは次のようになります。win32apiFILE_ATTRIBUTE_REPARSE_POINTwin32con

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メソッドを使用する必要があります。

于 2018-08-10T15:25:28.380 に答える
-2

if file[-4:len(file)] != ".lnk":私のために作品を使うだけ

于 2018-08-09T13:17:28.127 に答える