2008-09-23 9 views
7

में लॉजिकल निर्देशिका पथ कैसे प्राप्त/सेट करें पाइथन में लॉजिकल निर्देशिका प्राप्त करना या सेट करना संभव है (एक पूर्ण के विपरीत)।पायथन

उदाहरण के लिए अगर मेरे पास है:

/real/path/to/dir 

और मैं

/linked/path/to/dir 

समान निर्देशिका से जुड़ा हुआ है।

os.getcwd और os.chdir का उपयोग कर हमेशा निरपेक्ष पथ

>>> import os 
>>> os.chdir('/linked/path/to/dir') 
>>> print os.getcwd() 
/real/path/to/dir 

एक ही रास्ता मैं सब पर इस के आसपास पाने के लिए मिल गया है का उपयोग करेगा एक और प्रक्रिया में 'लोक निर्माण विभाग' का शुभारंभ और आउटपुट को पढ़ने के लिए है । हालांकि, यह तब तक काम करता है जब तक आप पहली बार os.chdir को कॉल नहीं करते।

उत्तर

11

अंतर्निहित परिचालन प्रणाली/खोल पाइथन के वास्तविक पथ रिपोर्ट करता है।

तो, वास्तव में इसके आसपास कोई रास्ता नहीं है, क्योंकि os.getcwd() सी लाइब्रेरी getcwd() फ़ंक्शन पर एक लपेटा गया कॉल है।

उस व्यक्ति की भावना में कुछ कामकाज हैं जिन्हें आप पहले ही जानते हैं जो pwd लॉन्च कर रहा है।

एक और में os.environ['PWD'] का उपयोग करना शामिल होगा। यदि वह वातावरण वातावरण चर सेट है तो आप इसे getcwd फ़ंक्शन कर सकते हैं जो इसका सम्मान करता है।

import os 
from subprocess import Popen, PIPE 

class CwdKeeper(object): 
    def __init__(self): 
     self._cwd = os.environ.get("PWD") 
     if self._cwd is None: # no environment. fall back to calling pwd on shell 
      self._cwd = Popen('pwd', stdout=PIPE).communicate()[0].strip() 
     self._os_getcwd = os.getcwd 
     self._os_chdir = os.chdir 

    def chdir(self, path): 
     if not self._cwd: 
      return self._os_chdir(path) 
     p = os.path.normpath(os.path.join(self._cwd, path)) 
     result = self._os_chdir(p) 
     self._cwd = p 
     os.environ["PWD"] = p 
     return result 

    def getcwd(self): 
     if not self._cwd: 
      return self._os_getcwd() 
     return self._cwd 

cwd = CwdKeeper() 
print cwd.getcwd() 
# use only cwd.chdir and cwd.getcwd from now on.  
# monkeypatch os if you want: 
os.chdir = cwd.chdir 
os.getcwd = cwd.getcwd 
# now you can use os.chdir and os.getcwd as normal. 
+0

धन्यवाद! getcwd() को स्वयं तर्क की आवश्यकता है - इसके अलावा यह पूरी तरह से काम करता है! – Moe

+0

ठीक है, तय, धन्यवाद। – nosklo

1

यह भी मेरे लिए काम कर देता है:

>>> import os 
>>> os.popen('pwd').read() 
'/home/projteam/staging/site/proj\n' 
>>> os.popen('pwd').read().strip('\n') 
'/home/projteam/staging/site/proj' 
>>> # Also works if PWD env var is set 
>>> os.getenv('PWD') 
'/home/projteam/staging/site/proj' 
>>> # This gets actual path, not symlinked path 
>>> import subprocess 
>>> p = subprocess.Popen('pwd', stdout=subprocess.PIPE) 
>>> p.communicate()[0] # returns non-symlink path 
'/home/projteam/staging/deploys/20150114-141114/site/proj\n' 

वातावरण हो रही है:

import os 
os.popen('pwd').read().strip('\n') 

यहाँ अजगर खोल में एक प्रदर्शन है

समाधान नीचे दोनों को जोड़ती है परिवर्तनीय पीडब्ल्यूडी हमेशा मेरे लिए काम नहीं करता है इसलिए मैं पॉपन विधि का उपयोग करता हूं। चीयर्स!