2009-10-27 48 views
9

Có thể tất cả các đường dẫn trong chương trình Python sử dụng ".." (cho thư mục mẹ) và/(để tách thành phần đường dẫn) và vẫn hoạt động nền tảng?Đường dẫn Unix: chính thức hoạt động trong Python cho bất kỳ nền tảng nào?

Một mặt, tôi chưa bao giờ thấy yêu cầu đó trong tài liệu (tôi có thể đã bỏ qua nó), và các mô-đun os và os.path cung cấp các phương tiện để xử lý đường dẫn theo cách không thuyết phục trên nền tảng (os.pardir, os.path.join,…), cho phép tôi nghĩ rằng họ ở đây vì một lý do.

Mặt khác, bạn có thể read on StackOverflow rằng "../path/to/file" hoạt động trên tất cả các nền tảng ...

Vì vậy, nên os.pardir, os.path.join và bạn bè luôn được sử dụng, cho mục đích di động, hoặc là tên đường dẫn Unix luôn an toàn (lên đến các vấn đề mã hóa ký tự có thể)? hoặc có thể "hầu như luôn" an toàn (tức là hoạt động trong Windows, OS X và Linux)?

+4

chưa bao giờ gặp sự cố với/trên cửa sổ. – jldupont

Trả lời

6

"Hầu như luôn an toàn" là đúng. Tất cả các nền tảng mà bạn quan tâm có thể hoạt động tốt ngày hôm nay và tôi không nghĩ rằng họ sẽ thay đổi quy ước của họ sớm.

Tuy nhiên Python rất dễ di chuyển và chạy trên nhiều nền tảng thông thường. Lý do cho mô-đun os là giúp những thứ mượt mà trên đó một nền tảng có các yêu cầu khác nhau.

Có lý do chính đáng để bạn không sử dụng các chức năng os không?

os.pardir là tự chủ tài liệu trong khi ".." không phải là, và os.pardir có thể dễ dàng hơn để grep cho

Dưới đây là một số tài liệu từ python 1.6 khi Mac vẫn còn khác nhau cho tất cả mọi thứ

thói quen OS cho Mac, DOS, NT hoặc Posix tùy thuộc vào hệ thống chúng tôi đang bật.

Xuất khẩu này: - tất cả các chức năng từ posix, nt, dos, os2, mac hoặc ce, ví dụ: unlink, stat, vv - os.path là một trong các mô-đun posixpath, ntpath, macpath hoặc dospath - os.name là 'posix', 'nt', 'dos', 'os2', 'mac', hoặc 'ce' - os.curdir là một chuỗi đại diện cho thư mục hiện tại ('.' hoặc ':') - os.pardir là một chuỗi đại diện cho thư mục mẹ ('..' hoặc '::') - os.sep là dấu phân cách đường dẫn (hoặc phổ biến nhất) ('/' hoặc ':' hoặc '\') - os.altsep là dấu tách đường dẫn thay thế (Không có hoặc '/') - os.pathsep là phân tách thành phần được sử dụng trong $ PATH vv - os.linesep là dấu tách dòng trong tệp văn bản ('' hoặc '' hoặc '') - os.defpath là đường dẫn tìm kiếm mặc định cho tệp thực thi

Các chương trình nhập và sử dụng 'os' có cơ hội tốt hơn là sử dụng di động giữa các nền tảng khác nhau . Tất nhiên, sau đó, họ chỉ phải sử dụng các chức năng sử dụng được xác định bởi tất cả các nền tảng (ví dụ: hủy liên kết và opendir) và để tất cả thao tác tên đường dẫn đến os.path (ví dụ:, tách và tham gia).

+0

Lý do tôi nghĩ đến việc bỏ qua os.path và co. là nó đơn giản và khá rõ ràng để viết "../dir1/dir2/dir3/file" thay vì sử dụng os.path.join (os.pardir, ['dir1', 'dir2', 'dir3', 'file '])! – EOL

+0

@EOL Tôi không thể nghĩ ra quá nhiều chương trình thực sự cần đến điều đó. Có lẽ nó có ý nghĩa để di chuyển một con đường như thế ra thành một tập tin cấu hình. –

+0

@gnibbler Chương trình của tôi phân tích hàng nghìn bộ dữ liệu và lưu trữ kết quả ở các vị trí thông thường, trong đó tên thư mục được tính từ "tên" của từng tập dữ liệu. Nhưng vâng, os.path.join (os.pardir,…) gần như ngắn như mã hóa đường dẫn trực tiếp. – EOL

1

OS/X và Linux đều tương thích với Unix, do đó theo định nghĩa, chúng sử dụng định dạng bạn đã cung cấp khi bắt đầu câu hỏi. Windows cho phép "/" ngoài "\" để các chương trình có thể hoán đổi cho nhau với Xenix, một biến thể Unix mà Microsoft đã thử một thời gian dài trước đây, và khả năng tương thích đã được chuyển sang hiện tại. Vì vậy nó hoạt động quá.

Tôi không biết có bao nhiêu nền tảng Python khác đã được chuyển đến và tôi không thể nói cho họ biết.

3

Trong trăn, sử dụng / sẽ luôn hoạt động. Bạn sẽ cần phải biết về quy ước của hệ điều hành nếu bạn muốn thực thi lệnh trong một vỏ con

myprog = "/path/to/my/program" 
os.system([myprog, "-n"])       # 1 
os.system([myprog, "C:/input/file/to/myprog"])  # 2 

Lệnh # 1 có thể hoạt động như mong đợi.
Lệnh # 2 có thể không hoạt động nếu myprog là lệnh Windows và hy vọng phân tích đối số dòng lệnh của nó để lấy tên tệp Windows.

+1

chỉ là một lưu ý phụ - không bao giờ sử dụng 'os.system' để chạy chương trình. nó lấy một chuỗi (không phải là một danh sách như bạn đã sử dụng), và needlessy gọi một shell. Sử dụng mô-đun 'subprocess' để thay thế. – nosklo

3

Windows hỗ trợ / làm dấu tách đường dẫn. Các không tương thích duy nhất giữa tên tập tin Unix và tên tập tin của Windows là:

  • ký tự được phép trong tên tập tin
  • tên đặc biệt và
  • nhạy trường hợp

Windows is more restrictive in the first two accounts (đây là, nó có nhân vật bị cấm hơn và các tên đặc biệt hơn), trong khi Unix thường phân biệt chữ hoa chữ thường. Có một số answers ở đây liệt kê chính xác các ký tự và tên này là gì. Tôi sẽ xem nếu tôi có thể tìm thấy chúng.

Bây giờ, nếu môi trường phát triển của bạn đi kèm với một chức năng để tạo hoặc điều khiển đường dẫn, bạn nên sử dụng nó, nó ở đó vì một lý do, bạn biết đấy. Đặc biệt là vì có nhiều nền tảng hơn Windows và Unix.

Trả lời câu hỏi đầu tiên của bạn, có ../dir/file sẽ hoạt động, trừ khi chúng đạt đến một số điều không tương thích được đề cập ở trên.

+0

Đừng quên sự khác biệt trong trường hợp nhạy cảm. –

11

Tôi chưa bao giờ gặp bất kỳ sự cố nào khi sử dụng .., mặc dù bạn nên chuyển đổi nó thành đường dẫn tuyệt đối bằng cách sử dụng os.path.abspath. Thứ hai, tôi khuyên bạn nên luôn sử dụng os.path.join ở bất kỳ nơi nào có thể.Có rất nhiều trường hợp góc (ngoài các vấn đề về tính di động) khi tham gia đường dẫn, và tốt nhất là không phải lo lắng về chúng. Ví dụ:

>>> '/foo/bar/' + 'qux' 
'/foo/bar/qux' 
>>> '/foo/bar' + 'qux' 
'/foo/barqux' 
>>> from os.path import join 
>>> join('/foo/bar/', 'qux') 
'/foo/bar/qux' 
>>> join('/foo/bar', 'qux') 
'/foo/bar/qux' 

Bạn có thể gặp vấn đề với sử dụng .. nếu bạn đang ở trên một số nền tảng tối nghĩa, nhưng tôi không thể đặt tên bất kỳ (Windows, * nix, và OS X đều ủng hộ rằng ký hiệu).

3

Nó hoạt động trên Windows, vì vậy nếu bạn xác định "nền tảng bất kỳ" là Unix và Windows, bạn vẫn ổn.

Mặt khác, Python cũng chạy trên VMS, RISC OS và các nền tảng kỳ quặc khác sử dụng các quy ước tên tệp hoàn toàn khác. Tuy nhiên, có khả năng là cố gắng để ứng dụng của bạn chạy trên VMS, bị mù, là kiểu ngớ ngẩn - "tính di động sớm là gốc của một số tà ác nhỏ"

Tôi thích sử dụng các hàm os.path vì chúng là tốt cho thể hiện ý định - thay vì chỉ là một chuỗi nối, mà có thể được thực hiện cho bất kỳ mục đích triệu, nó đọc rất rõ ràng như là một thao tác đường dẫn.

0

Như những người khác đã nói, dấu gạch chéo sẽ hoạt động trong mọi trường hợp, nhưng bạn nên tạo danh sách các đoạn đường dẫn và os.path.join() - ing chúng.

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