Làm thế nào để có được/thiết lập đường dẫn thư mục hợp lý trong python


7

Trong python là nó có thể để có được hoặc thiết lập một thư mục hợp lý (như trái ngược với một tuyệt đối).

Ví dụ nếu tôi có:

/real/path/to/dir 

và tôi có

/linked/path/to/dir 

liên quan đến cùng một thư mục.

sử dụng os.getcwd và os.chdir sẽ luôn luôn sử dụng đường dẫn tuyệt đối

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

Cách duy nhất tôi đã tìm thấy để làm được việc này ở tất cả là để khởi động 'pwd' trong quá trình khác và đọc kết quả . Tuy nhiên, điều này chỉ hoạt động cho đến khi bạn gọi os.chdir lần đầu tiên.

11

Hệ thống/vỏ hoạt động cơ bản báo cáo đường dẫn thực sự tới python.

Vì vậy, thực sự không có cách nào xung quanh nó, vì os.getcwd() là cuộc gọi được gửi đến hàm C Library getcwd().

Có một số cách giải quyết theo tinh thần mà bạn đã biết đang khởi chạy pwd.

Một số khác sẽ liên quan đến việc sử dụng os.environ['PWD']. Nếu biến môi trường đó được thiết lập, bạn có thể thực hiện một số chức năng getcwd để tôn trọng nó.

Các giải pháp dưới đây kết hợp cả hai:

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

Cảm ơn! getcwd() cần một đối số tự - khác hơn là nó hoạt động hoàn hảo! 23 sep. 082008-09-23 21:50:47

  0

được, cố định, cảm ơn. 23 sep. 082008-09-23 23:09:47


1

này cũng làm các trick cho tôi:

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

Đây là một cuộc biểu tình trong vỏ python:

>>> 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' 

Bắt môi trường biến PWD không phải lúc nào cũng làm việc cho tôi vì vậy tôi sử dụng phương thức popen. Chúc mừng!