在不使用os.chdir()的情况下在python中创建相对符号链接

Jos*_*osh 6 python symlink multithreading

假设我有一个文件路径:

/path/to/some/directory/file.ext
Run Code Online (Sandbox Code Playgroud)

在python中,我想在与文件相同的目录中创建一个符号链接,指向该文件.我想最终得到这个:

/path/to/some/directory/symlink -> file.ext
Run Code Online (Sandbox Code Playgroud)

我可以很容易地使用os.chdir()来cd进入目录并创建符号链接.但是os.chdir()不是线程安全的,所以我想避免使用它.假设进程的当前工作目录不是包含该文件的目录(os.getcwd()!='/ path/to/some/directory'),那么最好的方法是什么?

我想我可以在我所在的任何目录中创建一个被破坏的链接,然后将其移动到包含该文件的目录:

import os, shutil
os.symlink('file.ext', 'symlink')
shutil.move('symlink', '/path/to/some/directory/.')
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

注意,我不想最终得到的是:

/path/to/some/directory/symlink -> /path/to/some/directory/file.ext
Run Code Online (Sandbox Code Playgroud)

Wes*_*ter 20

您也可以使用,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))
    )
Run Code Online (Sandbox Code Playgroud)

列出dst/然后显示的内容:

1.txt -> ../src/1.txt
2.txt -> ../src/2.txt
Run Code Online (Sandbox Code Playgroud)

如果你想创建整个foo目录树的tarball,相关符号链接很有用,因为我不认为tar更新符号链接指向生成的tarball内部的相对路径.


tit*_*ito 14

您可以将第二个参数设置为目标,例如:

import os
os.symlink('file.ext', '/path/to/some/directory/symlink')
Run Code Online (Sandbox Code Playgroud)

  • 只要确保链接文件不存在,或者更好,删除它`os.remove("/ path/to/some/directory/symlink")` (2认同)