Создание относительной символической ссылки в python без использования os.chdir () - PullRequest
6 голосов
/ 20 марта 2012

Скажите, у меня есть путь к файлу:

/path/to/some/directory/file.ext

В python я хотел бы создать символическую ссылку в том же каталоге, что и файл, чтобы указывает на файл. Я хотел бы закончить с этим:

/path/to/some/directory/symlink -> file.ext

Я могу сделать это довольно легко, используя os.chdir (), чтобы перейти в каталог и создать символические ссылки. Но os.chdir () не является потокобезопасным, поэтому я хотел бы избежать используй это. Предполагая, что текущий рабочий каталог процесса не каталог с файлом (os.getcwd ()! = '/ path / to / some / directory'), какой лучший способ сделать это?

Полагаю, я мог бы создать перенаправленную ссылку в любом каталоге, в котором я сейчас нахожусь, переместите его в каталог с файлом:

import os, shutil
os.symlink('file.ext', 'symlink')
shutil.move('symlink', '/path/to/some/directory/.')

Есть ли лучший способ сделать это?

Обратите внимание, я не хочу закончить с этим:

/path/to/some/directory/symlink -> /path/to/some/directory/file.ext

Ответы [ 2 ]

19 голосов
/ 13 ноября 2012

Вы также можете использовать os.path.relpath(), чтобы использовать символические ссылки с относительными путями. Скажем, ваш скрипт находится в каталоге foo/, и в этом каталоге есть подкаталоги src/ и dst/, и вы хотите создать относительные символические ссылки в dst/, чтобы указывать на файлы в src/. Для этого вы можете сделать:

import os
from glob import glob
for src_path in glob('src/*'):
    os.symlink(
        os.path.relpath(
            src_path,
            'dst/'
        ),
        os.path.join('dst', os.path.basename(src_path))
    )

Перечисление содержимого dst/ затем показывает:

1.txt -> ../src/1.txt
2.txt -> ../src/2.txt

Относительные символические ссылки полезны, если вы хотите создать тарбол из всего дерева каталогов foo, так как я не верю, что tar обновляет символические ссылки, чтобы указывать на относительный путь внутри сгенерированного тарбола.

13 голосов
/ 20 марта 2012

Вы можете просто установить второй аргумент для пункта назначения, например:

import os
os.symlink('file.ext', '/path/to/some/directory/symlink')
...