2012-03-20 20 views
5

मैं एक फाइल करने के लिए एक रास्ता है कहो , फ़ाइल को इंगित करता है। मैं इस के साथ खत्म करना चाहते हैं:os.chdir का उपयोग किए बिना अजगर में एक रिश्तेदार सिमलिंक बनाना()

/path/to/some/directory/symlink -> file.ext 

मैं निर्देशिका में इस os.chdir काफी आसानी से उपयोग कर() सीडी के लिए कर सकते हैं और सिमलिंक पैदा करते हैं। लेकिन os.chdir() थ्रेड सुरक्षित नहीं है, इसलिए मैं इसका उपयोग कर से बचना चाहता हूं। यह मानते हुए कि प्रक्रिया की वर्तमान कार्यशील निर्देशिका फ़ाइल (os.getcwd()! = '/ Path/to/some/directory') के साथ निर्देशिका नहीं है, ऐसा करने का सबसे अच्छा तरीका क्या है?

मुझे लगता है मैं जो कुछ भी निर्देशिका में एक पर्दाफाश लिंक मैं तैयार हूं बना सकते हैं, तो फ़ाइल के साथ निर्देशिका में ले जाएं :

import os, shutil 
os.symlink('file.ext', 'symlink') 
shutil.move('symlink', '/path/to/some/directory/.') 

वहाँ यह करने के लिए एक बेहतर तरीका है?

ध्यान दें, मैं नहीं चाहता कि अंत करने के लिए इस के साथ हैं:

/path/to/some/directory/symlink -> /path/to/some/directory/file.ext 
+0

यह बहुत ही मामूली लगता है: 'os.symlink ('/tar/get/of/link ','/var/tmp/lnk ') '' var/tmp/lnk'' बनायेगा चाहे आप अभी कहां हों , और इस पर ध्यान दिए बिना कि '/ tar/get/of' मौजूद है, आदि। यदि आप लक्ष्य चाहते हैं कि लक्ष्य'/'से शुरू न हो तो बस 'os.symlink (' target ','/var/tmp/lnk ')' । – torek

उत्तर

12

तुम बस गंतव्य के लिए दूसरा तर्क सेट कर सकते हैं, जैसे:

import os 
os.symlink('file.ext', '/path/to/some/directory/symlink') 
+1

दोह! उसके लिए धन्यवाद। कुल समझ में आता है और मैं कोशिश नहीं करने के लिए मूर्खतापूर्ण महसूस करता हूं। – Josh

+1

बस सुनिश्चित करें कि लिंक फ़ाइल मौजूद नहीं है, या बेहतर है, इसे हटाएं 'os.remove ("/ path/to/some/directory/symlink") ' –

14

आप भी कर सकते हैं os.path.relpath() का उपयोग करें ताकि आप सापेक्ष लिंक को सापेक्ष पथ के साथ उपयोग कर सकें। मान लें कि आपकी स्क्रिप्ट निर्देशिका foo/ में है और इस निर्देशिका में उपनिर्देशिका src/ और dst/ है, और आप में फ़ाइलों को इंगित करने के लिए dst/ में सापेक्ष सिम्लिंक बनाना चाहते हैं। ऐसा करने के लिए, आप कर सकते हैं:

import os 
from glob import glob 
for src_path in glob('src/*'): 
    os.symlink(
     os.path.relpath(
      src_path, 
      'dst/' 
     ), 
     os.path.join('dst', os.path.basename(src_path)) 
    ) 

लिस्टिंग dst/ के सामग्री का पता चलता है:

1.txt -> ../src/1.txt 
2.txt -> ../src/2.txt 

सापेक्ष सिमलिंक उपयोगी होते हैं के लिए आप पूरी foo निर्देशिका वृक्ष की एक टारबॉल बनाने के लिए, के रूप में चाहते हैं मुझे विश्वास नहीं है कि tar जेनरेटेड टैरबॉल के अंदर सापेक्ष पथ को इंगित करने के लिए सिम्लिंक अपडेट करता है।