2013-05-05 7 views
5

मेरे पास कई धागे हैं जिनमें से प्रत्येक कार्यशील निर्देशिका बदल रही है और कभी-कभी इन निर्देशिकाओं में विशिष्ट कार्य निर्देशिकाओं, प्रतिलिपि/फ़ाइलों को स्थानांतरित करने में नए बना रही है। ऐसा सोचें .:पाइथन में थ्रेड-विशिष्ट os.chdir और mkdir क्या है?

def thread1: 
    while True: 
    os.chdir('dir') 
    os.mkdir('newdir') 
    os.system('mv *.png newdir/') 
    do something 

def thread2: 
    while True: 
    os.chdir('another-dir') 
    os.mkdir('another-newdir') 
    os.system('mv *.png another-newdir/') 
    do something 

मैंने पढ़ा है कि chdir, mkdir फ़ंक्शन थ्रेड के लिए विशिष्ट नहीं हैं बल्कि वैश्विक हैं। इसे पूरा करने का एक तरीका क्या है? मैं पूर्ण पथ का उपयोग करने की कोशिश कर सकता हूं लेकिन क्या यह सबसे अच्छा समाधान है?

+1

इसे हल करने का एक त्वरित तरीका कभी भी 'os.chdir()' 'को कॉल नहीं करना है। आपके मामले में यह 'os.mkdir ('dir/newdir') बन जाएगा; ओएससिस्टम ('सीडी डीआईआर एंड एमवी * .पीएनजी न्यूडीर /') ''। ध्यान दें कि 'cd'' शेल कमांड के अंदर है। –

+0

फिर भी एक और समाधान - लिनक्स पर - 'unshare (CLONE_FS)' फ़ंक्शन का उपयोग करना है, लेकिन निश्चित रूप से सी को लिखना या ctypes/cffi का उपयोग करना आवश्यक है। –

उत्तर

5

कार्य निर्देशिका प्रक्रिया की एक जानकारी है, इसलिए सभी धागे समान कार्य निर्देशिका साझा करते हैं। यदि आप एकाधिक धागे का उपयोग करना चाहते हैं तो पूर्ण पथों के साथ काम करना चाहिए।

आप os.path मॉड्यूल का उपयोग करके आसानी से पूर्ण पथ प्राप्त कर सकते हैं।

एक अन्य चीज जिसे आप विचार कर सकते हैं, बाहरी प्रक्रियाओं को कॉल करने के बजाय प्रतिलिपि बनाने के लिए पाइथन की मानक लाइब्रेरी का उपयोग कर रहा है।

उदाहरण के लिए देखें:

+0

शायद बहुत उपयोगी नहीं है, लेकिन लिनक्स पर एक समाधान मौजूद है (जो अन्य ओएस पर मौजूद नहीं है, और पाइथन AFAIK के संपर्क में नहीं है): अधिक जानने के लिए 'man mkdirat'' करें। –

+0

@ आर्मिनरिगो, [mkdirat] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html) पॉज़िक्स है। – pilcrow

+0

@pilcrow: आप सही हैं। इसके अलावा, इसे पायथन 3.3 में जोड़ा गया है जहां आप उदाहरण के लिए कह सकते हैं 'os.open (..., dir_fd = fd) '। –

1

वर्तमान कार्यशील निर्देशिका ओएस स्तर पर आम तौर पर, विशिष्ट प्रक्रिया है धागा प्रति नहीं। (लिनक्स: unshare देखें)

पायथन आंतरिक फ़ाइल संचालन अधिकतर os.path.join() का उपयोग करने के लिए फिर से लिखा जा सकता है और chdir() से बचें।

जब यह संभव नहीं है, उदा। अपरिवर्तनीय कोड के लिए, RExec प्रकार के सैंडबॉक्स निष्पादन या तो, तो आप वर्चुअल os मॉड्यूल, open फ़ंक्शन इत्यादि प्रदान कर सकते हैं जो दृश्यों के पीछे पथ समायोजन करते हैं।

बाहरी कार्यक्रमों को कॉल करने के लिए, आप subprocess.Popen() कॉल और दोस्तों में cwd=... तर्क प्रदान कर सकते हैं।

संबंधित मुद्दे