问题
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
回答1:
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)
回答2:
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
回答3:
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.
回答4:
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?
来源:https://stackoverflow.com/questions/1762831/create-broken-symlink-with-python