python中的In -sf原子(符号链接覆盖现有文件) [英] Atomic `ln -sf` in python (symlink overwriting exsting file)

查看:125
本文介绍了python中的In -sf原子(符号链接覆盖现有文件)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个符号链接,如果需要,可以覆盖现有文件或符号链接.

I want create a symlink, overwriting an existing file or symlink if needed.

我发现 os.path.exists 对于不中断的符号链接仅返回True,因此我猜测任何测试还必须包括

I've discovered that os.path.exists only returns True for non-broken symlinks, so I'm guessing that any test must also include os.path.lexists.

在python中实现ln -sf的最原子的方法是什么? (即,防止在删除和符号链接创建之间由另一个进程创建文件)

What is the most atomic way to implement ln -sf in python? (Ie, preventing a file being created by another process between deletion and symlink creation)

区别:此问题未指定基本要求

推荐答案

此代码尝试将竞争条件的可能性降至最低:

This code tries to minimise the possibilities for race conditions:

import os
import tempfile

def symlink_force(target, link_name):
    '''
    Create a symbolic link link_name pointing to target.
    Overwrites link_name if it exists.
    '''

    # os.replace() may fail if files are on different filesystems
    link_dir = os.path.dirname(link_name)

    while True:
        temp_link_name = tempfile.mktemp(dir=link_dir)
        try:
            os.symlink(target, temp_link_name)
            break
        except FileExistsError:
            pass
    try:
        os.replace(temp_link_name, link_name)
    except OSError:  # e.g. permission denied
        os.remove(temp_link_name)
        raise

注意:

  1. 如果功能中断(例如计算机崩溃),则可能存在指向目标的其他随机链接.

  1. If the function is interrupted (e.g. computer crashes), an additional random link to the target might exist.

仍然存在不太可能的竞争条件:在替换link_name之前,可以通过另一个进程修改在随机命名的temp_link_name处创建的符号链接.

An unlikely race condition still remains: the symlink created at the randomly-named temp_link_name could be modified by another process before replacing link_name.

我提出了一个 python问题,以突出显示os.symlink()要求目标不存在的问题.

I raised a python issue to highlight the issues of os.symlink() requiring the target not exist.

贷记到罗伯特·塞默尔(Robert Seimer)的输入.

这篇关于python中的In -sf原子(符号链接覆盖现有文件)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆