Python no puede abrir mi archivo vinculado. Me aseguré de que el archivo existe y puedo acceder a él. Tenía la impresión de que los enlaces simbólicos se resuelven en el nivel del sistema operativo, por lo que Python nunca lo sabría.

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 es claramente capaz de resolver el archivo de imagen con enlace simbólico. Sin embargo, el método Python open() me falla:

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'
>>>

¿Alguna idea de lo que estoy haciendo mal? La ayuda es muy apreciada.

10
Tom 13 may. 2016 a las 19:20

3 respuestas

La mejor respuesta

¿Alguna idea de lo que estoy haciendo mal?

El objetivo del enlace simbólico no existe.

No entiendo por qué pude resolverlo en la declaración ls en mi pregunta.

No estabas

El comando ls por defecto opera en el enlace en sí, no en el destino del enlace. En ausencia de la opción -L, ls nunca intenta resolver el enlace simbólico.

Considere un directorio con estos dos archivos:

$ 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 es un archivo de texto que contiene los seis bytes 'hello\n'. b es un archivo de enlace que contiene los tres bytes a su ruta de destino: './a'. ls puede describir las propiedades del enlace sin desreferenciar el enlace en sí.

Por el contrario, use la opción -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

Ahora ls ha resuelto el enlace en b y muestra información sobre el archivo vinculado. Con -L, ls ahora afirma que b también es un archivo de texto de seis bytes.

Finalmente, considere esto:

$ 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

Ahora b es un enlace que se resuelve en un archivo que ya no existe. Dado que ls -l nunca intenta resolver el enlace, su salida no cambia desde la prueba anterior. (b es un archivo de enlace, 3 bytes de longitud, contenido './a'.)

Pero ls -lL intenta resolver el enlace, falla y muestra la información de falla.

11
Robᵩ 13 may. 2016 a las 17:04

... no olvides usar rutas completas. En Raspberry Pi con Python 3.7.3 tuve que incluir todas las rutas para un enlace de trabajo:

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

Python3 no reconoció el archivo a.txt porque las rutas del shell estándar no están activas.

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

Funciona bien.

1
peets 16 dic. 2019 a las 10:41

Estoy registrando una respuesta porque llegué a esta pregunta con el mismo problema, pero el objetivo de mi enlace simbólico existía .

Intentar abrir un archivo a través de un enlace simbólico en pandas dio un mensaje inútil:

⇒  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'   

Como el objetivo existía, la respuesta anterior no me ayudó, pero la pregunta me llevó a intentar abrir una pitón normal en lugar de a través de 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

No sé qué significa todo eso, pero supongo que la causa es:

Python para Windows no puede seguir los enlaces simbólicos de Ubuntu (WSL 2) (o, al menos, no puede abrir los enlaces simbólicos de Ubuntu a un archivo de Windows.

Por supuesto, esto plantea la pregunta de por qué debería ejecutar Windows Python desde Ubuntu para procesar un archivo de Windows, pero eso sería más apropiado en stack-psychoanalysis-for-self-sabotaging-programmers.

0
Sigfried 10 mar. 2020 a las 12:07