2011-11-28 2 views
17

में एक सिम्लिंक को संशोधित करना मैं पाइथन में एक फ़ाइल से दूसरे में इंगित करने के लिए सिम्लिंक के रूप में कैसे बदलूं? Os.symlink() फ़ंक्शन केवल नए सिम्लिंक बनाने के लिए काम करता प्रतीत होता है।पायथन

उत्तर

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 के लिए प्रलेखन के अनुसार, विंडोज में एक सिमलिंक को परमाणु रूप से बदलने का कोई तरीका नहीं हो सकता है। उस स्थिति में, आप बस हटा देंगे और फिर से तैयार करेंगे।

+4

अजगर 3.3 है 'os.replace' जिसका उपयोग पॉज़िक्स और विंडोज सिस्टम पर समान व्यवहार प्रदान करने के लिए 'os.rename' के बजाय किया जा सकता है। – Tom

0

मामले में एक उठाने के आदेश जोड़ने के लिए मत भूलना जब e.errno = errno.EEXIST आप नहीं तो एक त्रुटि छुपाना चाहते हैं:

if e.errno == errno.EEXIST: 
    os.remove(link_name) 
    os.symlink(target, link_name) 
else: 
    raise