Mathias
Mathias

Reputation: 1476

Create broken symlink with Python

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

Upvotes: 7

Views: 13733

Answers (4)

Mattias Nilsson
Mattias Nilsson

Reputation: 3757

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?

Upvotes: 0

Denis Otkidach
Denis Otkidach

Reputation: 33200

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)

Upvotes: 11

P&#228;r Wieslander
P&#228;r Wieslander

Reputation: 28934

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

Upvotes: 3

tayfun
tayfun

Reputation: 3135

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.

Upvotes: 0

Related Questions