2011-02-02 6 views
5

मैं विंडोज कमांड लाइन खोल निष्पादन करने के लिए os.system() का उपयोग कर रहा हूं। मैं विंडोज सीएमडी वर्तमान निर्देशिका को बदलना चाहता हूं।पायथन: क्या वास्तविक वर्तमान निर्देशिका को बदले बिना विंडोज कमांड लाइन खोल वर्तमान निर्देशिका को बदलना संभव है?

os.chdir('newPath') 

लेकिन chdir() भी वास्तविक अजगर वर्तमान कार्यशील निर्देशिका बदल जाएगा: यहाँ यह कर में से एक तरीका है। मैं वास्तविक पायथन कार्य निर्देशिका को बदलना नहीं चाहता क्योंकि मैं अपनी स्क्रिप्ट के अन्य हिस्सों को मूल वर्तमान कार्यशील निर्देशिका में चलाने के लिए चाहता हूं। मैं जो बदलना चाहता हूं वह केवल विंडोज सीएमडी वर्तमान कार्यशील निर्देशिका है। दूसरे शब्दों में: मैं os.system() आदेशों को एक मौजूदा कार्यशील निर्देशिका (विंडोज सेमीडी वर्तमान कार्यशील निर्देशिका) में चलाने के लिए चाहता हूं जबकि किसी और को वर्तमान कार्यशील निर्देशिका (वास्तविक पायथन वर्तमान कार्यशील निर्देशिका) में चलाना चाहिए।

यहाँ एक और केवल विंडोज वर्तमान निर्देशिका cmd बदलने की कोशिश है:

os.system('cd newPath') 

हालांकि, कि स्पष्ट रूप से काम नहीं करता है के बाद से सही cd newPath आदेश के निष्पादन के बाद विंडोज वर्तमान निर्देशिका cmd रीसेट किया जाता है (क्योंकि मैं अगली कॉल में os.system() पर उसी विंडोज कमांड खोल का उपयोग नहीं करूंगा)।

क्या यह विंडोज सेमीड शैल के लिए एक अलग वर्तमान कार्यशील निर्देशिका है? (वास्तविक वर्तमान कार्यशील निर्देशिका से अलग)।

+1

'मैं वर्तमान कार्यशील निर्देशिका रखना चाहते हैं जबकि केवल बदल विंडोज वर्तमान कार्यशील directory' cmd - क्या? –

+0

@ ब्लूराजा: आप सही हैं। मैं स्पष्ट नहीं था। बस इसे और स्पष्ट करने के लिए सवाल संपादित किया। – snakile

उत्तर

7

subprocess मॉड्यूल os.system को बदलने के लिए करना है।

अन्य बातों के अलावा, यह आप subprocess.Popen() है, जो पैदा की प्रक्रिया के लिए काम निर्देशिका (वास्तव में अपनी स्थिति के लिए) निर्दिष्ट करने के लिए एक cwd तर्क लेता देता है।

देखें: http://docs.python.org/library/subprocess.html

उदाहरण उपयोग os.system की जगह:

p = subprocess.Popen("yourcmd" + " yourarg", shell=True, cwd="c:/your/path") 
sts = os.waitpid(p.pid, 0)[1] 
+0

धन्यवाद। क्या आप कृपया 'os.waitpid()' चीज़ पर कुछ शब्द जोड़ सकते हैं? – snakile

+1

@snak waitpid दस्तावेज़ में वर्णित है। आप अनुमान लगा सकते हैं कि यह क्या करता है। –

+3

'retcode = subprocess.call ([" yourcmd "," arg1 "," arg2 "], shell = true, cwd =" c:/your/path ")' – Apalala

1

यह केवल विंडोज पर काम करने की है, तो एक तरह से हो सकता है:

os.system('start /d newPath cmd') 
+0

क्यों न सिर्फ 'सीडी mypath शुरू करें'? होवेवर यह बिल्कुल स्पष्ट नहीं है कि यह सवाल कहां जा रहा है, माना जाता है कि ज़िगडन और अन्य ने – MattiaG

+0

को इंगित किया है, मुझे लगता है कि लिनक्स पर भी इसी प्रकार का समाधान लागू होता है। –

1

आप os.system का उपयोग करते हैं, आप एक ही आदेश खोल पुन: उपयोग नहीं कर रहे हैं, लेकिन प्रत्येक अनुरोध के लिए एक नया एक को उत्पन्न करने। इसका मतलब यह है कि आप वास्तव में इनवॉक्शंस के बीच प्रचार करने के लिए इसमें बदलाव की उम्मीद नहीं कर सकते हैं।

आप हालांकि एक आवरण लिख सकता है, कि हमेशा आदेश शुरू करने से पहले निर्देशिका आप चाहते करने के लिए बदल जाएगा।

+0

धन्यवाद, लेकिन मुझे इस तथ्य को पता है कि मैं एक ही खोल का पुन: उपयोग नहीं कर रहा हूं। मैं जो पूछ रहा था वह है कि उस समस्या को दूर करने और वास्तविक वर्तमान डीआईआर को बदले बिना विंडोज़ वर्तमान डायर को कैसे बदला जाए। – snakile