gpt4 book ai didi

python - python 中的原子 `ln -sf`(符号链接(symbolic link)覆盖现有文件)

转载 作者:行者123 更新时间:2023-12-04 17:38:08 25 4
gpt4 key购买 nike

我想创建一个符号链接(symbolic link),在需要时覆盖现有文件或符号链接(symbolic link)。

我发现 os.path.exists只为未损坏的符号链接(symbolic link)返回 True,所以我猜任何测试都必须包含 os.path.lexists .

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


微分:This question没有指定原子要求

最佳答案

此代码尽量减少竞争条件的可能性:

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. 如果功能中断(例如计算机崩溃),则可能存在指向目标的额外随机链接。

  2. 不太可能的竞争条件仍然存在:在随机命名的 temp_link_name 中创建的符号链接(symbolic link)可能会在替换 link_name 之前被另一个进程修改。

我提出了 python issue突出显示要求目标不存在的 os.symlink() 问题。

归功于 Robert Seimer's input .

关于python - python 中的原子 `ln -sf`(符号链接(symbolic link)覆盖现有文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55740417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com