2017-02-27 8 views
0

ディレクトリを作成する単純な関数を考えて、現在の作業ディレクトリの下に置く必要があるディレクトリへのシンボリックリンクを考えてみましょう。ディレクトリとリンクが現在の作業ディレクトリ内に直接存在する場合、このプロセスは成功します。しかし、ディレクトリとリンクがさらにネストされると、ディレクトリの作成は成功し、作成されたシンボリックリンクは破損し、不正なパスを指します。相対パスのみを使用してPythonでシンボリックリンクを作成する方法

In [1]: def make_dir_and_symlink(dir_relative_to_cwd, sym_relative_to_cwd): 
    ...:  os.mkdir(dir_relative_to_cwd) 
    ...:  os.symlink(dir_relative_to_cwd, sym_relative_to_cwd) 
    ...:  

In [2]: make_dir_and_symlink("test", "test-link") 

In [3]: os.path.exists("test") 
Out[3]: True 

In [4]: os.path.exists("test-link") 
Out[4]: True 

In [5]: make_dir_and_symlink("test/other-test", "test/other-test-link") 

In [6]: os.path.exists("test/other-test") 
Out[6]: True 

In [7]: os.path.exists("test/other-test-link") 
Out[7]: False 

第二の例の任意の絶対パスに頼ることなく、どのようにどこかに現在の作業ディレクトリへの相対パス内のシンボリックリンクを作成することができますか?

答えて

0

これがos.path.relpathos.path.basenameを組み合わせることにより、限られた状況のために達成することができる表示されます。シンボリックリンクの位置が目標位置に対して任意の可能な場合

def make_dir_and_symlink(dir_relative_to_cwd, sym_relative_to_cwd): 
    os.mkdir(dir_relative_to_cwd) 
    target_name = os.path.basename(
     os.path.relpath(dir_relative_to_cwd, sym_relative_to_cwd) 
    ) 
    os.symlink(target_name, sym_relative_to_cwd) 



In [1]: def make_dir_and_symlink(dir_relative_to_cwd, sym_relative_to_cwd): 
    ...:  os.mkdir(dir_relative_to_cwd) 
    ...:  os.symlink(os.path.basename(os.path.relpath(dir_relative_to_cwd, sym_relative_to_cwd)), sym_relative_to_cwd) 
    ...:  

In [2]: make_dir_and_symlink("test", "test-link") 

In [3]: os.path.exists("test") 
Out[3]: True 

In [4]: os.path.exists("test-link") 
Out[4]: True 

In [5]: make_dir_and_symlink("test/other-test", "test/other-test-link") 

In [6]: os.path.exists("test/other-test") 
Out[6]: True 

In [7]: os.path.exists("test/other-test-link") 
Out[7]: True 

これは一般的なケースを扱うことが期待されていません。 os.path.basenameは、パス名の直後の基本コンポーネントのみを返します。したがって、この状況では、ターゲットとシンボリックリンクが、現在の作業ディレクトリから始まるツリー内で隣り合っていると考えられます。

絶対パスを解決する必要はありませんが、依然としてリンク名をターゲット名に対して現在の作業ディレクトリ内で任意にすることができるソリューションは非常に貴重です。

関連する問題