Создать битую символическую ссылку с Python - PullRequest
4 голосов
/ 19 ноября 2009

Используя Python, я хочу создать символическую ссылку, указывающую на несуществующий путь. Однако os.symlink просто жалуется на "OSError: [Errno 2] Нет такого файла или каталога:" .. Это легко сделать с помощью программы ln , но как это сделать на Python без вызова ln программа от Python?

Редактировать: как-то я действительно испортил это: / ... оба ответа ниже верны

Ответы [ 4 ]

7 голосов
/ 19 ноября 2009

Такая ошибка возникает при попытке создать символическую ссылку в несуществующей директории. Например, следующий код не будет выполнен, если /tmp/subdir не существует:

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

Но это должно успешно выполняться:

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)
3 голосов
/ 19 ноября 2009

Файл не должен существовать для создания символической ссылки. В следующем примере демонстрируется создание символической ссылки на несуществующий файл:

Сначала убедитесь, что в /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

Создайте символическую ссылку с именем brokensymlink, указывающую на /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')

Убедитесь, что символическая ссылка была создана и место назначения все еще не существует:

[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
0 голосов
/ 19 ноября 2009

Это может быть ваш ответ:

$ 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

Вы меняли аргументы? Или вы просто пытаетесь создать символическую ссылку в несуществующей директории?

0 голосов
/ 19 ноября 2009

Вы уверены, что вызываете символическую ссылку с правильными параметрами?

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

Это должно создать символическую ссылку на / usr / bin / python из python в текущем рабочем каталоге.

...