2012-07-28 96 views
17

作業ディレクトリのシンボリックリンクを削除しようとしましたが、いくつかの問題に直面しています。Pythonでシンボリックリンクを削除するには?

os.remove

os.shutilがシンボリックリンクの場合にエラーをスローリンクの元のフォルダの実際の内容を削除します。

元のコンテンツを破壊することなく、Pythonコマンドを使ってシンボリックリンクを削除する方法はありますか?ディレクトリ名の末尾にスラッシュが含まれている場合

おかげ

+7

奇妙な、 'os.remove()'のために、元のファイルを削除しません。 Python 2.7.2と3.1.4で試したシンボリックリンクのみです。 –

+1

私のシステム(Python 2.7.1)でも元のファイルも削除されません –

+0

シンボリックリンクをシンボリックに見てみましょう:http://stackoverflow.com/a/12678252/110118 (注:shutil.rmtreeは削除に失敗しますパスはos.path.osdir()にもかかわらず、パスはディレクトリに関係しています) – mlvljr

答えて

20

os.unlink()が私に役立ちます。リンク先のディレクトリを削除せずにシンボリックリンクを削除します。

+0

ええ、それはありがたくでした – akshayc11

+10

Python 2.7のドキュメントはunlinkについて言います: 'これはremove();と同じ機能ですが、どのように問題を解決しましたか? –

+0

この解決策は、 'mklink/D'を介して作成されたディレクトリリンクに対してはWindowsでは動作しません。それがあなたの問題なら、私の答えを見てください。 – MOnsDaR

3

は、Linuxのrmコマンドは、リンクをたどるとディレクトリを削除しようとします。 Remove a symlink to a directoryを参照してください。 os.removedocumentationは、ディレクトリを削除しようとするとOSErrorと表示されますが、シンボリックリンクの場合は常にそうであるとは限りません。

+1

OSError:[Errno 1] Operationは許可されていません: 'test /' 'です。おそらくそれは実装に依存します。 –

+1

私は便利なPythonを持っていません。私はこれが推測だと言っていたはずです。私は答えを編集しました。 –

+0

@JohnWattsあなたの答えは本当ですが、これはシェルによって作成されたシンボリックリンクに対してのみ当てはまります。 'os.symlink'で作成されたシンボリックリンクでも同じ問題が発生する – akshayc11

1

申し訳ありませんが、私のバッドは、私は愚かなプログラミングミスを犯しました。私はリンクの代わりにソースを愚かに削除していました。

正解は@samfrancesです。

os.unlinkです。これに加えて

、あなたのpython使用してディレクトリをクリアしたい場合は、ここでいくつかの他のヒント:

確かにスレッドセーフではないが、あなたのアイデアを得る...

def rm(obj): 

    if os.path.exists(obj): 
     if os.path.isdir(obj): 
      if os.path.islink(obj): 
       os.unlink(obj) 
      else: 
       shutil.rmtree(obj) 
     else: 
      if os.path.islink(obj): 
       os.unlink(obj) 
      else: 
       os.remove(obj) 
+0

は 'if os.path.exists(obj)'を実行し、 'if os.path.islink'なら' if os.path.isdir'を実行します。あなたはos.unlinkを2回持つ必要はありません。 – QxQ

2

受け入れ答えはありませんmklink /Dで作成されたリンクのあるWindowsでは動作しません。それはあなたの問題であれば答えはこの質問に掲載されていますDelete Symlink to directory on Windows

次のコードは、両方のシステム上で動作するはずです:

if(os.path.isdir(targetLink)): 
    os.rmdir(targetLink) 
else: 
    os.unlink(targetLink) 
関連する問題