どのようにPythonでパイソン


7

論理ディレクトリパスを設定/取得するには(絶対的ではなく)論理的ディレクトリを取得または設定することが可能です。例えば

私が持っている場合:

/real/path/to/dir 

を、私は同じディレクトリにリンク

/linked/path/to/dir 

を持っています。 os.getcwdとos.chdirを使用して

はいつも私がすべてではこの問題を回避することが分かってきた唯一の方法は別のプロセスで「PWD」を起動し、出力を読み取ることで、絶対パス

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

を使用します。 。ただし、これはos.chdirを初めて呼び出すまで有効です。

11

基盤となる業務システム/シェルは、Pythonへの本当のパスを報告します。

os.getcwd()は、Cライブラリgetcwd()のラップされた呼び出しであるため、実際にはまったく存在しません。

pwdを起動され、あなたが既に知っている1の精神でいくつかの回避策があります。

もう一つはos.environ['PWD']を使っ伴うだろう。そのenvironmnent変数が設定されている場合、あなたはそれを尊重し、いくつかの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()は自己引数を必要とします - それ以外は完全に動作します! 23 9月. 082008-09-23 21:50:47

  0

大丈夫、固定、ありがとう。 23 9月. 082008-09-23 23:09:47


1

また、これは私のためのトリックん:

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

ここでは、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' 

環境を取得変数PWDは常に私のために働いたわけではないので、私はpopenメソッドを使用します。乾杯!