web-dev-qa-db-ja.com

pythonでシンボリックリンクまたはソフトリンクのターゲットファイルの完全な(絶対パス)を見つける方法

ls -l /etc/fonts/conf.d/70-yes-bitmaps.confを指定すると

_lrwxrwxrwx <snip> /etc/fonts/conf.d/70-yes-bitmaps.conf -> ../conf.avail/70-yes-bitmaps.conf
_

シンボリックリンクまたはソフトリンクの場合、Pythonでターゲットファイルのフル(絶対パス)を見つける方法、

私が使用する場合

os.readlink('/etc/fonts/conf.d/70-yes-bitmaps.conf')

出力する

_../conf.avail/70-yes-bitmaps.conf_

しかし、私は相対パスではなく絶対パスが必要なので、私の希望する出力は、

_/etc/fonts/conf.avail/70-yes-bitmaps.conf_

_.._をシンボリックリンクまたはソフトリンクファイルの親ディレクトリの実際のフルパスで置き換える方法。

57
duhhunjonn
os.path.realpath(path)

os.path.realpath は、指定されたファイル名の正規のパスを返し、パス内で発生したシンボリックリンクを削除します。

103
unutbu

Unutbuが言うように、os.path.realpath(path)は正しい答えであり、指定されたファイル名の標準パスを返し、ターゲットへのシンボリックリンクを解決する必要があります。しかし、Windowsでは壊れています。

このバグを修正するためにPython 3.2のパッチを作成し、次の場所にアップロードしました。

http://bugs.python.org/issue9949

_Python32\Lib\ntpath.py_のrealpath()関数を修正します

また、サーバーに配置しました:

http://www.burtonsys.com/ntpath_fix_issue9949.Zip

残念ながら、バグはPython 2.xにも存在し、そこでの修正はありません。

14
Dave Burton

http://docs.python.org/library/os.path.html#os.path.abspath

また、現在の作業ディレクトリにいるか、他の場所で作業しているかに応じて、joinpathとnormpathも使用します。 normpathの方がより直接的な場合があります。

更新:

具体的には:

os.path.normpath( 
  os.path.join( 
    os.path.dirname( '/etc/fonts/conf.d/70-yes-bitmaps.conf' ), 
    os.readlink('/etc/fonts/conf.d/70-yes-bitmaps.conf') 
  ) 
)
8
eruciform

documentationos.path.join()を使用するように言っています:

結果は、絶対パス名でも相対パス名でもかまいません。相対の場合、os.path.join(os.path.dirname(path), result)を使用して絶対パス名に変換できます。

0
Don Kirkby

Windows 10では、python 3.5、os.readlink("C:\\Users\PP")ここで、 "C:\ Users\PP"はシンボリックリンク(ジャンクションリンクではない)が機能します。

ディレクトリへの絶対パスを返します。

これはUbuntu 16.04で動作します。python 3.5も同様です。

0
alpha_989

ファイルシステム操作には pathlib ライブラリを使用することをお勧めします。

_import pathlib

x = pathlib.Path('lol/lol/path')
x.resolve()
_

Documentationfor Path.resolve(strict=False):パスを絶対にし、シンボリックリンクを解決します。新しいパスオブジェクトが返されます。

0
Alex