파이썬에서 한 파일에서 다른 파일로 심볼릭 링크를 변경하려면 어떻게해야합니까? os.symlink() 함수는 새로운 심볼릭 링크를 만드는 것으로 보인다.파이썬에서 심볼릭 링크 수정하기
17
A
답변
9
먼저 os.unlink()
수 있으며 os.symlink()
새 대상을 가리 키도록 다시 만듭니다.
6
이 질문을 최근에 조사한 결과, 가장 좋은 방법은 실제로 unlink
이고 그 다음은 symlink
입니다. 당신이 자동 교체와 함께 예를 들어, 깨진 링크를 해결하기 위해 단지 필요한 경우에, 당신은 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)
15
이 때문에 기존 파일의 실패 할 경우 심볼릭 링크와 시도 약간의 기능, 그것을 제거 다시 연결됩니다.
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
12
원자 수정이 필요한 경우 링크 해제가 작동하지 않습니다.
더 나은 솔루션은 새 임시 심볼릭 링크를 만든 다음에 그것을 이름을 변경하는 것이 하나의 기존 :
당신은 할 확인할 수 있습니다확실히 올바르게 너무 업데이트 된
os.symlink(target, tmpLink)
os.rename(tmpLink, linkName)
:
if os.path.realpath(linkName) == target:
# Symlink was updated
os.rename에 대한 설명서에 따르면 Windows에서 심볼 링크를 원자 적으로 변경할 수있는 방법이 없을 수 있습니다. 이 경우 삭제하고 다시 만듭니다.
0
e.errno는 = errno.EEXIST 그런 다음 오류 숨기려하지 않을 때 경우에 인상 명령을 추가하는 것을 잊지 마십시오!
if e.errno == errno.EEXIST:
os.remove(link_name)
os.symlink(target, link_name)
else:
raise
파이썬 3.3이를'os.replace' POSIX 및 Windows 시스템에서 동일한 동작을 제공하기 위해'os.rename' 대신 사용할 수 있습니다. – Tom