Làm cách nào để thay đổi như liên kết tượng trưng trỏ từ tệp này sang tệp khác trong Python? Hàm os.symlink() dường như chỉ hoạt động để tạo các liên kết mới.Sửa đổi một liên kết tượng trưng trong python
Trả lời
Bạn có thể os.unlink()
trước tiên và sau đó tạo lại bằng cách sử dụng os.symlink()
để trỏ đến mục tiêu mới.
Tôi đã nghiên cứu câu hỏi này gần đây và phát hiện ra rằng cách tốt nhất thực sự là unlink
và sau đó là symlink
. Nhưng nếu bạn chỉ cần để sửa chữa các liên kết bị hỏng, ví dụ với tính năng tự động thay thế, sau đó bạn có thể làm os.readlink
:
for f in os.listdir(dir):
path = os.path.join(dir, f)
old_link = os.readlink(path)
new_link = old_link.replace(before, after)
os.unlink(path)
os.symlink(new_link, path)
Một chức năng ít mà cố gắng liên kết mềm và nếu nó không thành công vì một tập tin hiện có, nó loại bỏ nó và liên kết lại.
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
Nếu bạn cần sửa đổi nguyên tử, hủy liên kết sẽ không hoạt động.
Một giải pháp tốt hơn là để tạo ra một liên kết tượng trưng tạm thời mới, và sau đó đổi tên nó trên hiện có:
os.symlink(target, tmpLink)
os.rename(tmpLink, linkName)
Bạn có thể kiểm tra để chắc chắn rằng nó đã được cập nhật một cách chính xác quá:
if os.path.realpath(linkName) == target:
# Symlink was updated
Theo tài liệu hướng dẫn cho os.rename, có thể không có cách nào để thay đổi nguyên tử một liên kết tượng trưng trong Windows. Trong trường hợp đó, bạn chỉ cần xóa và tạo lại.
Đừng quên để thêm một lệnh tăng lương trong trường hợp khi e.errno = errno.EEXIST Bạn không muốn để ẩn một lỗi sau đó:
if e.errno == errno.EEXIST:
os.remove(link_name)
os.symlink(target, link_name)
else:
raise
Python 3.3 có 'os.replace' có thể được sử dụng thay vì 'os.rename' để cung cấp cùng một hành vi trên các hệ thống Posix & Windows. – Tom