【问题标题】:Creating a relative symlink in python without using os.chdir()在不使用 os.chdir() 的情况下在 python 中创建相对符号链接
【发布时间】:2012-03-20 19:33:26
【问题描述】:

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

/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

【问题讨论】:

    标签: python multithreading symlink


    【解决方案1】:

    您还可以使用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 会更新符号链接以指向生成的压缩包内的相对路径。

    【讨论】:

    • 只是一个警告:您的解决方案看起来不错,它给我留下了深刻的印象。我试图将它应用在稍微不同的情况下。 relpath 似乎——根据其他讨论——不是很笼统。 python relpath 函数仅适用于目录,应用于完整文件路径它并不总是产生预期的结果(我通常观察到它包括/../..,而只需要/..
    【解决方案2】:

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

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

    【讨论】:

    • 噢!感谢那。完全有道理,没有尝试过我觉得很傻。
    • 只要确保链接文件不存在,或者更好,删除它os.remove("/path/to/some/directory/symlink")
    • 为了工作,你必须在'file.ext'的文件夹中,所以你可能不得不使用os.chdir()
    • @JeanPaul 不,这不是真的,它适用于您当前的工作目录。试试看。
    • @lenz 很糟糕,它工作正常,看来我没有正确测试。
    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多