Create broken symlink with Python
Asked Answered
C

4

7

Using Python I want to create a symbolic link pointing to a path that does not exist. However os.symlink just complains about "OSError: [Errno 2] No such file or directory:".. This can easily be done with the ln program, but how to do it in Python without calling the ln program from Python?

Edit: somehow I really messed this up :/ ... both answers below is correct

Clein answered 19/11, 2009 at 12:3 Comment(3)
what version of python are you using?Halcomb
what operating system are you using and are you sure the target directory for the symlink exists?Awakening
Could you just add the output from an interactive session here? I tried the answer from Pär Wieslander and it works fine on my Solaris box and on windows (in cygwin). However, if you reverse the arguments, I get the same error as you do.Haunted
D
11

Such error is raised when you try to create a symlink in non-existent directory. For example, the following code will fail if /tmp/subdir doesn't exist:

os.symlink('/usr/bin/python', '/tmp/subdir/python')

But this should run successfully:

src = '/usr/bin/python'
dst = '/tmp/subdir/python'

if not os.path.isdir(os.path.dirname(dst)):
    os.makedirs(os.path.dirname(dst))
os.symlink(src, dst)
Desert answered 19/11, 2009 at 12:24 Comment(0)
M
3

The file doesn't need to exist in order to create the symlink. The following example demonstrates creating a symlink to a non-existing file:

First, check that there's no file named foobar in /home/wieslander/tmp:

[wieslander@rizzo tmp]$ ls -l /home/wieslander/tmp/foobar
ls: cannot access /home/wieslander/tmp/foobar: No such file or directory

Create a symlink named brokensymlink pointing to /home/wieslander/tmp/foobar:

[wieslander@rizzo tmp]$ python
Python 2.5.2 (r252:60911, Sep 30 2008, 15:42:03)
[GCC 4.3.2 20080917 (Red Hat 4.3.2-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.symlink('/home/wieslander/tmp/foobar', 'brokensymlink')

Check that the symlink was created and that the destination still doesn't exist:

[wieslander@rizzo tmp]$ ls -l brokensymlink
lrwxrwxrwx 1 wieslander wieslander 27 19 nov 13.13 brokensymlink -> /home/wieslander/tmp/foobar
[wieslander@rizzo tmp]$ ls -l /home/wieslander/tmp/foobar
ls: cannot access /home/wieslander/tmp/foobar: No such file or directory
Malanie answered 19/11, 2009 at 12:19 Comment(0)
B
0

Are you sure you are calling symlink with the right parameters?

os.symlink('/usr/bin/python', 'python')

This should create a symlink to /usr/bin/python from python in the current working directory.

Benefic answered 19/11, 2009 at 12:8 Comment(1)
Ooops, I should have read the question more carefully. Sorry about that. It seems you need to have the file to link to it.Benefic
H
0

This might be your answer:

$ python
Python 2.5.2 (r252:60911, Dec  2 2008, 09:26:14)
[GCC 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.symlink('/this/does/not/exist', 'broken')
>>> os.symlink('broken', '/this/does/not/exist')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory

Did you reverse the arguments? Or are you simply trying to create the symlink in a directory that does not exist?

Haunted answered 19/11, 2009 at 12:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.