2016-05-13 19 views
4

私はsimlinkedファイルを開くことができません。ファイルが存在することを確認し、アクセスできます。シンボリックリンクがOSレベルで解決されているという印象を受けていたので、Pythonはこれを知りませんでした。Pythonはシンボリックリンクされたファイルを開くことができません

[email protected]:~/Programming/ML/deeptank/dataset/inc (master)$ ls -lisa /Users/therold/Programming/ML/deeptank/dataset/inc/training/tanks/matilda-iv_689.png 
7870541 8 lrwxr-xr-x 1 therold staff 46 13 Mai 16:44 /Users/therold/Programming/ML/deeptank/dataset/inc/training/tanks/matilda-iv_689.png -> ../training_data/matilda-iv/matilda-iv_689.png 

OSXはシンボリックリンクされたイメージファイルを明確に解決できます。しかし、Pythonのopen()方法は、私は失敗します。

[email protected]:~/Programming/ML/deeptank/dataset/inc (master)$ python 
Python 2.7.10 (default, Sep 23 2015, 04:34:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)] on darwin 
>>> open("/Users/therold/Programming/ML/deeptank/dataset/inc/training/tanks/matilda-iv_689.png") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 2] No such file or directory: '/Users/therold/Programming/ML/deeptank/dataset/inc/training/tanks/matilda-iv_689.png' 
>>> 

すべてのアイデアは、私が間違っているのでしょうか?ヘルプは非常に感謝しています。

+4

シンボリックリンクが壊れている可能性があります。 OSがリンクが指し示す宛先を読み取ることができても、宛先が存在するとは限りません。それを確認できますか? – WGH

+0

シンボリックリンクは相対リンクとして作成されたようです。したがって、グローバルなPythonインストールでは、相対参照を解決した後にファイルを開くことができません。 – Tom

+0

'ls -lL/Users/therold/Programming/ML/deeptank/dataset/inc/training/tanks/matilda-iv_689.png'を試してファイルの存在を確認してください。 –

答えて

5

私が間違っていることは何ですか?

シンボリックリンクのターゲットは存在しません。

なぜ私は私の質問のlsステートメントでそれを解決できたのか分かりません。

あなたはそうではありませんでした。

デフォルトでは、lsコマンドはリンクのターゲットではなく、リンク自体で動作します。 -Lオプションが指定されていない場合、lsはシンボリックリンクの解決を試みません。

は、これらの2個のファイルとディレクトリを考えてみましょう:

$ ls -l 
-rw-rw-r-- 1 me me 6 May 13 11:58 a 
lrwxrwxrwx 1 me me 3 May 13 12:00 b -> ./a 

aは6バイト'hello\n'を含むテキストファイルです。 bは、そのターゲットパスまでの3バイトを含むリンクファイルです:'./a'lsはリンクのプロパティを記述することができ、リンク自体を参照解除することはできません。これとは対照的に

-Lオプションを使用します。ls

$ ls -lL 
-rw-rw-r-- 1 me me 6 May 13 11:58 a 
-rw-rw-r-- 1 me me 6 May 13 11:58 b 

b内のリンクを解決し、リンク先のファイルに関する情報を表示しています。 -Lでは、lsは、bも6バイトのテキストファイルであると主張しています。

最後に、この検討してください:今すぐ

$ rm a 
$ ls -l 
lrwxrwxrwx 1 me me 3 May 13 12:00 b -> ./a 
$ ls -lL 
ls: cannot access b: No such file or directory 
l????????? ? ? ? ?   ? b 

bもはや存在しないファイルに解決のリンクです。 ls -lは決してリンクを解決しようとしないので、その出力は以前のテストと変わりません。 (bは3バイト長のリンクファイルです。'./a'

ただし、ls -lLは、リンクの解決を試みて失敗し、失敗情報を表示します。

+0

詳しい回答はありがとうございます。 – Tom

関連する問題