में एक सिम्लिंक को संशोधित करना मैं पाइथन में एक फ़ाइल से दूसरे में इंगित करने के लिए सिम्लिंक के रूप में कैसे बदलूं? Os.symlink() फ़ंक्शन केवल नए सिम्लिंक बनाने के लिए काम करता प्रतीत होता है।पायथन
पायथन
उत्तर
आप पहले os.unlink()
इसे पहले कर सकते थे, और फिर नए लक्ष्य को इंगित करने के लिए os.symlink()
का उपयोग करके फिर से बना सकते हैं।
मैंने हाल ही में इस प्रश्न का शोध किया, और पाया कि सबसे अच्छा तरीका वास्तव में 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)
एक छोटी सी समारोह जो सिमलिंक के लिए और अगर यह किसी मौजूदा फ़ाइल के कारण विफल रहता कोशिश करता है, यह उसे निकाल देता है और फिर से लिंक।
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.symlink(target, tmpLink)
os.rename(tmpLink, linkName)
आप बनाने के लिए जाँच कर सकते हैं यकीन है कि इसे सही ढंग से भी अद्यतन किया गया था:
if os.path.realpath(linkName) == target:
# Symlink was updated
os.rename के लिए प्रलेखन के अनुसार, विंडोज में एक सिमलिंक को परमाणु रूप से बदलने का कोई तरीका नहीं हो सकता है। उस स्थिति में, आप बस हटा देंगे और फिर से तैयार करेंगे।
मामले में एक उठाने के आदेश जोड़ने के लिए मत भूलना जब e.errno = errno.EEXIST आप नहीं तो एक त्रुटि छुपाना चाहते हैं:
if e.errno == errno.EEXIST:
os.remove(link_name)
os.symlink(target, link_name)
else:
raise
अजगर 3.3 है 'os.replace' जिसका उपयोग पॉज़िक्स और विंडोज सिस्टम पर समान व्यवहार प्रदान करने के लिए 'os.rename' के बजाय किया जा सकता है। – Tom