Python 3.x 如果symlink已经存在,如何覆盖Python3中现有的symlink?

Python 3.x 如果symlink已经存在,如何覆盖Python3中现有的symlink?,python-3.x,bash,symlink,data-race,Python 3.x,Bash,Symlink,Data Race,我有一个工作的bash脚本,它创建和/或重写当前的符号链接到一个新路径,而不需要任何数据竞争。如果程序试图查找路径,则会从符号链接获取旧路径或新路径。这是因为-f模式。下面是它在bash中的外观: cd /srv/ ln -nsf /home/myproject/video123.ts latest_video.mkv ln -nsf /home/myproject/video124.ts latest_video.mkv ln -nsf /home/myproject/video125.ts

我有一个工作的bash脚本,它创建和/或重写当前的符号链接到一个新路径,而不需要任何数据竞争。如果程序试图查找路径,则会从符号链接获取旧路径或新路径。这是因为-f模式。下面是它在bash中的外观:

cd /srv/
ln -nsf /home/myproject/video123.ts latest_video.mkv
ln -nsf /home/myproject/video124.ts latest_video.mkv
ln -nsf /home/myproject/video125.ts latest_video.mkv
在python3中,其中有一个名为os.symlink()的模块,它创建了一个符号链接,但无法实现覆盖行为

import os, errno

def symlink_force(target, link_name):
    try:
        os.symlink(target, link_name)
    except OSError, e:
        if e.errno == errno.EEXIST:
            os.remove(link_name)
            os.symlink(target, link_name)
        else:
            raise e
正如您所看到的,在调用os.remove(link\u name)方法时,有时会出现停机。关于如何在不删除现有符号链接的情况下进行覆盖,有什么想法吗


非常感谢您的帮助。

检查ln-nsf(带strace)的行为将显示该命令由两个系统调用执行:

  • 使用目标文件夹中的临时文件名在源文件中创建符号链接
  • 将临时文件重命名为目标文件
这种方法(相对于remove/symlink)的优点是,重命名可以保证目标文件在任何时候都指向旧文件或新文件

可能的Python实现(假设可以安全地使用“.new”作为临时链接)


Cehcking ln-nsf(带strace)的行为将显示该命令由两个系统调用执行:

  • 使用目标文件夹中的临时文件名在源文件中创建符号链接
  • 将临时文件重命名为目标文件
这种方法(相对于remove/symlink)的优点是,重命名可以保证目标文件在任何时候都指向旧文件或新文件

可能的Python实现(假设可以安全地使用“.new”作为临时链接)

def symlink_force(target, link_name):
    try:
       temp_link = link_name + ".new"
       os.remove(temp_link)
       os.symlink(target, temp_link)
       os.rename(temp_link, link_name)
    except OSError e:
       # Handle critical errors