62

Pythonで絶対パスを構築したいと同時に、パスセパレーターのようなものをかなり無視したままにします。

edit0:たとえば、ファイル システムのルート/etc/init.d(またはw32) にディレクトリがあり、要素と(w32 では、おそらく のようなディスク ID も必要です)C:\etc\init.dからのみこれを構築したいと考えています。etcinit.dC:

パスセパレーターについて心配する必要がないようにするために、os.join.path()明らかに最適なツールです。しかし、これは相対パスのみを作成するようです:

 print("MYPATH: %s" % (os.path.join('etc', 'init.d'),)
 MYPATH: etc/init.d

ダミーの最初の要素 (例: '') を追加しても何の役にも立たない:

 print("MYPATH: %s" % (os.path.join('', 'etc', 'init.d'),)
 MYPATH: etc/init.d

最初の要素を絶対にすることは明らかに役立ちますが、この種の要素を使用するという考えは無効になりますos.path.join()

 print("MYPATH: %s" % (os.path.join('/etc', 'init.d'),)
 MYPATH: /etc/init.d

edit1:を使用os.path.abspath()すると、相対パスを絶対パスに変換しようとするだけです。たとえば、作業ディレクトリで次を実行することを検討して/home/fooください。

 print("MYPATH: %s" % (os.path.abspath(os.path.join('etc', 'init.d')),)
 MYPATH: /home/foo/etc/init.d

では、パスを「ルート化」するための標準的なクロスプラットフォームの方法は何ですか?

 root = ??? # <--
 print("MYPATH: %s" % (os.path.join(root, 'etc', 'init.d'),)
 MYPATH: /etc/init.d

edit2:質問は本当に次のように要約されます: 先頭のスラッシュ/etc/init.dがこのパスを絶対パスにするため、この先頭のスラッシュをプログラムで構築する方法はありますか? (先頭のスラッシュが絶対パスを示していると仮定したくありません)

4

5 に答える 5

88

os.sepルートとして使用するとうまくいきました:

path.join(os.sep, 'python', 'bin')

Linux:/python/bin

ウィンドウズ:\python\bin

ミックスに追加path.abspath()すると、Windows でもドライブ文字が得られ、Linux との互換性も維持されます。

path.abspath(path.join(os.sep, 'python', 'bin'))

Linux:/python/bin

ウィンドウズ:C:\python\bin

于 2015-01-22T02:41:14.017 に答える
4

使えると思いますos.path.normpath。これが私がWindowsで得たものです:

>>> os.path.normpath("/etc/init.d")
'\\etc\\init.d'

ドライブプレフィックスをどうするのが正しいのか正確にはわかりませんが、それをオフにしておくことは、「現在使用しているドライブを使い続ける」のような意味だと思います。これはおそらくあなたが望んでいることです. たぶん、Windowsに詳しい人が明確にすることができますか?

于 2014-12-05T23:37:02.290 に答える
1

したがって、sys.platfrom で実行中の OS をチェックできます。

Windows 上

>>> sys.platform
'win32'

Linux で

>>> sys.platform
'linux2'

それから

if sys.platform == 'win32':
    ROOT = os.path.splitdrive(os.path.abspath('.'))[0]
elif sys.platform == 'linux2':
    ROOT = os.sep

「linux2」はすべての Linux ディストリビューションをカバーしていない可能性があることに注意してください

于 2013-07-02T15:19:45.613 に答える
-1

os.path.splitdriveドライブ/ファイルシステムの名前を取得してから、これを文字列と結合してみてくださいfoo

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

のようなもの (未テスト!)

(drive, tail) = os.path.splitdrive(os.getcwd())
os.path.join(drive, 'foo')

トリックを行う必要があります。

于 2013-07-02T15:56:57.813 に答える