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

不使用os.chdir()在python中创建相对符号链接,python,multithreading,symlink,Python,Multithreading,Symlink,假设我有一个文件的路径: /path/to/some/directory/file.ext 在python中,我想在与文件相同的目录中创建一个符号链接 指向文件。最后,我想说: /path/to/some/directory/symlink -> file.ext 使用os.chdir()将cd放入目录并 创建符号链接。但是os.chdir()不是线程安全的,所以我想避免 使用它。假设进程的当前工作目录不是 包含文件的目录(os.getcwd()!='/path/to/some/dir

假设我有一个文件的路径:

/path/to/some/directory/file.ext
在python中,我想在与文件相同的目录中创建一个符号链接 指向文件。最后,我想说:

/path/to/some/directory/symlink -> file.ext
使用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/.')
有更好的方法吗

注意,我不想以以下内容结束:

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

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

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

您还可以使用
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
目录树的tarball,相对符号链接非常有用,因为我不相信
tar
会更新符号链接以指向生成的tarball内的相对路径。

Doh!谢谢你。这完全有道理,而且我觉得没有尝试过这一点很愚蠢。只要确保链接文件不存在,或者最好将其删除
os.remove(“/path/to/some/directory/symlink”)
对于该工作,您必须位于
'file.ext'
文件夹中,因此您可能必须使用
os.chdir()
@JeanPaul No,这不是真的,它可以从您当前的工作目录工作。试试看。@lenz我的错,它在工作,似乎我没有正确测试。只是警告:你的解决方案看起来不错,给我留下了深刻的印象。我试着把它应用到稍微不同的情况
relpath
似乎——根据其他讨论——不是很普遍。python relpath函数仅适用于应用于完整文件路径的目录,但它并不总是产生预期的结果(我通常注意到,当只需要
/../../..
时,它包括
/..
)。