Python无法打开符号链接文件

时间:2016-05-13 16:20:38

标签: python symlink

Python无法打开我的simlinked文件。我确保文件存在,我可以访问它。我的印象是,在操作系统级别上解析了符号链接,因此Python永远不会知道它。

therold@therold:~/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()方法让我失望:

therold@therold:~/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'
>>>

任何想法我做错了什么?非常感谢帮助。

5 个答案:

答案 0 :(得分:8)

  

任何想法我做错了什么?

符号链接的目标不存在。

  

我不明白为什么我能在我的问题的ls声明中解决它。

你不是。

默认情况下,ls命令在链接本身上运行,而不是在链接的目标上运行。如果没有-L选项,则ls永远不会尝试解析符号链接。

考虑一个包含这两个文件的目录:

$ 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是一个包含六个字节'hello\n'的文本文件。 b是一个链接文件,其中包含目标路径的三个字节:'./a'ls能够描述链接的属性,而无需取消引用链接本身。

相反,请使用-L选项:

$ 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

现在ls已解析b中的链接,并显示有关链接到文件的信息。 -L ls现在声称b也是一个六字节的文本文件。

最后,考虑一下:

$ 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尝试解析链接,失败并显示失败信息。

答案 1 :(得分:1)

我正在记录答案,因为我遇到了同样的问题,但是我的符号链接 did 的目标存在

尝试通过熊猫中的符号链接打开文件时,显示了一条无用的未找到消息:

⇒  ipython.exe  # this is a clue to the answer below...

In [1]: import pandas as pd

In [2]: codes = pd.read_excel('codes-no-agg-children.xlsx', ...)
---------------------------------------------------------------------------
<...lots of traceback stuff...>
FileNotFoundError: [Errno 2] No such file or directory: 'codes-no-agg-children.xlsx'   

由于目标确实存在,所以上面的答案对我没有帮助,但是这个问题促使我尝试打开常规的python而不是通过pandas:

In [3]: import os                                                                                                                                                                                                                                         
In [4]: os.system('cp ./nvivo-win/good-extracts/codes-no-agg-children.xlsx .')                                               
\\wsl$\Ubuntu\home\sigfried\ccvs\analysis'                                                                                  
CMD.EXE was started with the above path as the current directory.                                                            
UNC paths are not supported.  Defaulting to windows directory.                                                               
cp: cannot stat './nvivo-win/good-extracts/codes-no-agg-children.xlsx': No such file or directory

我不知道这意味着什么,但我认为原因是:

用于Windows的Python不能遵循Ubuntu(WSL 2)符号链接(或者,至少它不能将Ubuntu符号链接打开回到Windows文件。

当然,这引起了一个问题,为什么我要从Ubuntu运行Windows python来处理Windows文件-但这在stack-psychoanalysis-for-self-sabotaging-programmers上更合适。

答案 2 :(得分:1)

我有同样的问题——Fedora 32 系统,Jupyter 的 Notebook 文件夹包含我的文件,其中包含指向 json 文件的符号链接。我用头撞在众所周知的墙上几天,谷歌搜索失败了。 最后,复制文件解决了这个问题(尽管还有其他选项,如硬链接)。

答案 3 :(得分:1)

我今天遇到了类似的问题:当符号链接到文件,并将行读入数组时,一些数字字符串会被分解成单独的列表元素??

直接(而不是通过符号链接)打开原始文件时,此行为消失:

Original file -> Python list
123456  ->  '1', '23', '456', ''
123456789  ->  '1234567', '89'

十六进制编辑器必须正确遵循符号链接

$ head rockyou.txt | xxd
00000000: 3132 3334 3536 0a31 3233 3435 0a31 3233  123456.12345.123
00000010: 3435 3637 3839 0a70 6173 7377 6f72 640a  456789.password.
00000020: 696c 6f76 6579 6f75 0a70 7269 6e63 6573  iloveyou.princes
00000030: 730a 3132 3334 3536 370a 726f 636b 796f  s.1234567.rockyo
00000040: 750a 3132 3334 3536 3738 0a61 6263 3132  u.12345678.abc12
00000050: 330a                                     3.
$ head rockyou.txt.short | xxd
00000000: 3132 3334 3536 0a31 3233 3435 0a31 3233  123456.12345.123
00000010: 3435 3637 3839 0a70 6173 7377 6f72 640a  456789.password.
00000020: 696c 6f76 6579 6f75 0a70 7269 6e63 6573  iloveyou.princes
00000030: 730a 3132 3334 3536 370a 726f 636b 796f  s.1234567.rockyo
00000040: 750a 3132 3334 3536 3738 0a61 6263 3132  u.12345678.abc12
00000050: 330a                                     3.
$ ls -lah rock*
lrwxr-xr-x  1 u  g    17B Apr 16 10:56 rockyou.txt -> rockyou.txt.short
-rw-r--r--  1 u  g   945B Apr 16 11:39 rockyou.txt.short

MacOS Catalina,Python 3.7、3.8

答案 4 :(得分:0)

...不要忘记使用完整路径。在使用Python 3.7.3的Raspberry Pi上,我必须包括一个有效链接的整个路径:

os.symlink("Desktop/a.txt","Desktop/a_link.txt")  # WRONG !

python3无法识别文件a.txt,因为标准外壳程序的路径未激活。

os.symllink("/home/pi/Desktop/a.txt","/home/pi/Desktop/a_link.txt")

效果很好。