2010-05-09 13 views
5

मैं एक साधारण पायथन स्क्रिप्ट पर काम कर रहा हूं जो कुछ कमांड निष्पादित करने के लिए subprocess और/या os का उपयोग कर सकता है, जो ठीक काम कर रहा है।सीडी टर्मिनल किसी दिए गए निर्देशिका में?

हालांकि, जब स्क्रिप्ट निकलती है तो मैं वास्तविक टर्मिनल (इस मामले में ओएस एक्स) को बाहर निकलने पर cd करना चाहता हूं, इसलिए नई फाइलें निर्देशिका में उपयोग करने के लिए तैयार हैं जहां बनाई गई हैं। सभी निम्नलिखित (subprocess.Popen, os.system, os.chdir) (यानी वे लक्ष्य निर्देशिका में सामान पर अमल) जो मैं चाहता से भीतर स्क्रिप्ट कर सकते हैं, लेकिन बाहर निकलने पर स्क्रिप्ट के अपने निर्देशिका, नहीं लक्ष्य पर टर्मिनल छोड़ निर्देशिका।

मैं इसे प्राप्त करने के लिए अस्थायी फ़ाइल में एक शेल स्क्रिप्ट लिखने से बचना चाहता हूं, अगर यह संभव है तो यह संभव है?

उत्तर

10

दुख की बात है, नहीं। प्रक्रियाओं को उनकी मूल प्रक्रिया के पर्यावरण को बदलने की अनुमति नहीं है, और इस मामले में आपकी पायथन लिपि खोल की एक बाल प्रक्रिया है। आप अपनी पाइथन प्रक्रिया को एक नया खोल सेट करके "नकली" बना सकते हैं - एक शेल प्रक्रिया खोलने के लिए उपप्रोसेस को कॉल करें और इसे उपयोगकर्ता से पेश करें, संशोधित वातावरण को स्वयं से विरासत में मिलाएं - लेकिन उसमें पाइथन प्रक्रिया को चलाने के लिए मजबूती है लगातार।

यह वास्तव में शैल स्क्रिप्ट के लिए है .. :-) किसी को स्पष्ट रूप से एक और पारंपरिक खोल (जैसे आईपीथन से बैश के करीब) लिखने की आवश्यकता है जो पाइथन को अपनी स्क्रिप्टिंग भाषा के रूप में उपयोग कर सकता है।

+0

धन्यवाद - मैं फिर से लिखूंगा एक शेल स्क्रिप्ट के रूप में, और इसके बजाय पाइथन को कॉल करें :-) –

+0

आपको पाइथन दुभाषिया को चारों ओर लटकने की आवश्यकता नहीं है। आपको बस प्रक्रिया के माहौल को जिस तरह से आप चाहते हैं (जैसे 'os.chdir() ') और फिर' os.execv()' एक नया खोल प्राप्त करने की आवश्यकता है। हां, आपके पास अभी भी एक अधीनस्थ खोल चलाना होगा, लेकिन पायथन दुभाषिया को बदल दिया जाएगा। http://docs.python.org/library/os.html#os.execv – msw

+0

@msw: मैं कभी भी विशेष रूप से गोले के साथ सभी प्लेटफॉर्म पर विश्वसनीय रूप से इसे खींचने में सक्षम नहीं हूं (विशेष रूप से शक्तियां), लेकिन मेरे पास होना चाहिए सलाह दिया कि। –

1

क्या आपने वर्तमान शेल में प्रोग्राम चलाने की कोशिश की है?

यानी

$. script.py

बजाय

$script.py

+0

हाँ, और कोई भी समस्या नहीं, लेकिन धन्यवाद! –

+1

आप वर्तमान खोल में ** गैर-खोल ** स्क्रिप्ट नहीं चला सकते हैं। डॉट उपसर्ग इस मामले में कोई फर्क नहीं पड़ता है। – tzot

4

इस समय पाइथन को भूलना, कोई उपप्रोसेसर अपने आविष्कार खोल की स्थिति को बदल सकता है। इस प्रकार आपको एक ऐसे निर्माण की आवश्यकता है जो कॉलिंग शैल की स्थिति को बदल देता है जो पॉल क्रेसी पर संकेत दे रहा था।

alias mycd="cd `echo $1`" 

जहां echoscript_which_outputs_a_directory_name_on_stdout.py साथ प्रतिस्थापित किया जा सकता यह एक हैक की तरह है, लेकिन कम से कम यह एक पुराने हैक है।

+0

मैं देखता हूं कि आपका क्या मतलब है; हालांकि (अगर मैं फिर से लिखना नहीं चाहता हूं तो एक शेल स्क्रिप्ट के रूप में है), मुझे लगता है कि मैं अंत में 'cd [path_to_dir]' प्रिंट करूंगा ताकि इसे केवल कमांड लाइन पर कॉपी किया जा सके! –

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