2012-03-20 34 views
5

Nói rằng tôi có một đường dẫn đến một tập tin:Tạo một liên kết tượng trưng tương đối trong python mà không sử dụng os.chdir()

/path/to/some/directory/file.ext 

Trong python, tôi muốn tạo một liên kết tượng trưng trong cùng thư mục với tập tin , rằng trỏ đến tệp. Tôi muốn kết thúc với điều này:

/path/to/some/directory/symlink -> file.ext 

tôi có thể làm được điều này khá dễ dàng sử dụng os.chdir() để cd vào thư mục và tạo liên kết tượng trưng. Nhưng os.chdir() không phải là chủ đề an toàn, vì vậy tôi muốn tránh sử dụng nó. Giả sử rằng thư mục làm việc hiện tại của quy trình không phải là thư mục có tệp (os.getcwd()! = '/ Path/to/some/directory'), cách tốt nhất để làm điều này là gì?

Tôi đoán tôi có thể tạo ra một liên kết bị vỡ trong bất cứ thư mục Tôi đang ở, sau đó di chuyển nó vào thư mục với tập tin:

import os, shutil 
os.symlink('file.ext', 'symlink') 
shutil.move('symlink', '/path/to/some/directory/.') 

Có cách nào tốt hơn để làm điều này?

Lưu ý, tôi không muốn kết thúc với là thế này:

/path/to/some/directory/symlink -> /path/to/some/directory/file.ext 
+0

Điều này có vẻ vô cùng tầm thường: 'os.symlink ('/ tar/get/of/link', '/ var/tmp/lnk')' sẽ tạo '/ var/tmp/lnk' bất kể bạn đang ở đâu và bất kể '/ tar/get/of' có tồn tại hay không, vv Nếu bạn muốn mục tiêu không bắt đầu bằng'/'thì chỉ cần' os.symlink ('target', '/ var/tmp/lnk') ' . – torek

Trả lời

12

Bạn chỉ có thể thiết lập các đối số thứ hai đến đích, như:

import os 
os.symlink('file.ext', '/path/to/some/directory/symlink') 
+1

Doh! Cảm ơn vì điều đó. Làm cho cảm giác hoàn toàn và tôi cảm thấy ngớ ngẩn vì đã không thử điều đó. – Josh

+1

Chỉ cần chắc chắn rằng, tệp liên kết không tồn tại, hoặc tốt hơn, loại bỏ nó 'os.remove ("/path/to/some/directory/symlink ")' –

14

Bạn cũng có thể sử dụng os.path.relpath() để bạn có thể sử dụng các liên kết tượng trưng với các đường dẫn tương đối. Giả sử tập lệnh của bạn nằm trong thư mục foo/ và thư mục này có các thư mục con src/dst/ và bạn muốn tạo liên kết tượng trưng tương đối trong dst/ để trỏ đến các tệp trong src/. Để làm như vậy, bạn có thể làm:

import os 
from glob import glob 
for src_path in glob('src/*'): 
    os.symlink(
     os.path.relpath(
      src_path, 
      'dst/' 
     ), 
     os.path.join('dst', os.path.basename(src_path)) 
    ) 

Bảng liệt kê các nội dung của dst/ sau đó cho thấy:

1.txt -> ../src/1.txt 
2.txt -> ../src/2.txt 

symlink tương đối có ích cho nếu bạn muốn tạo một tarball của toàn bộ cây foo thư mục, như Tôi không tin rằng tar cập nhật liên kết tượng trưng để trỏ đến đường dẫn tương đối bên trong tarball được tạo.

Các vấn đề liên quan