2009-04-22 33 views
14

Tôi thường sử dụng os.path.exists() để kiểm tra xem tệp có ở đó không trước khi thực hiện bất kỳ điều gì với nó.os.path.exists() cho các tệp trong Đường dẫn của bạn?

Tôi đã chạy qua một tình huống mà tôi đang gọi một tệp thực thi có trong đường dẫn env đã định cấu hình, vì vậy nó có thể được gọi mà không chỉ định abspath.

Có điều gì có thể được thực hiện để kiểm tra xem tệp có tồn tại trước khi gọi không? (Tôi có thể rơi trở lại try/except, nhưng trước tiên tôi đang tìm kiếm một sự thay thế cho os.path.exists())

btw - Tôi đang làm điều này trên cửa sổ.

+0

Nó không đủ để kiểm tra xem nó có tồn tại; bạn cần phải kiểm tra xem nó có thể thực thi được hay không, trên UNIX ít nhất. –

Trả lời

13

Bạn có thể nhận biến môi trường PATH và thử "tồn tại()" cho .exe trong mỗi thư mục trong đường dẫn. Nhưng điều đó có thể thực hiện khủng khiếp.

ví dụ cho việc tìm kiếm notepad.exe:

import os 
for p in os.environ["PATH"].split(os.pathsep): 
    print os.path.exists(os.path.join(p, 'notepad.exe')) 

thông minh hơn ví dụ:

if not any([os.path.exists(os.path.join(p, executable) for p in os.environ["PATH"].split(os.pathsep)]): 
    print "can't find %s" % executable 

Có một lý do cụ thể mà bạn muốn tránh ngoại lệ? (bên cạnh giáo điều?)

+0

Tôi đã có mã hiện tại mà tôi muốn chuyển sang chấp nhận tệp trong đường dẫn. Vì vậy, nó chỉ dễ dàng hơn để thay thế os.path.exists() thay vì cấu trúc lại mã. : P – monkut

+0

Cảm ơn, tôi đã sử dụng mẫu của bạn và tạo một hàm để thay thế os.path.exists(). Lưu ý rằng os.enviorn ['PATH'] trả về một chuỗi, vì vậy bạn cần phải tách nó bằng dấu phân cách, trong cửa sổ ";". – monkut

+0

Ahh vui vì nó hoạt động. Xin lỗi vì quên việc chia nhỏ. –

0

Trên Unix bạn phải chia var PATH.

if any([os.path.exists(os.path.join(p,progname)) for p in os.environ["PATH"].split(":")]): 
    do_something() 
+1

không, bạn không cần sử dụng os.pathsep để làm cho nó hoạt động ở mọi nơi. – SilentGhost

2

Xin lưu ý rằng việc kiểm tra sự tồn tại và sau đó mở luôn mở cho điều kiện chủng tộc. Tệp có thể biến mất giữa kiểm tra của chương trình và quyền truy cập tiếp theo của tệp, vì các chương trình khác tiếp tục chạy trên máy.

Do đó, vẫn có thể có một ngoại lệ bị ném, mặc dù mã của bạn "chắc chắn" mà tệp tồn tại. Đây là, sau khi tất cả, tại sao họ được gọi là ngoại lệ.

2

Bạn thường không nên os.path.exists để cố gắng tìm ra nếu có điều gì đó sẽ thành công. Bạn chỉ nên thử nó và nếu bạn muốn bạn có thể xử lý ngoại lệ nếu nó không thành công.

3

Mở rộng tìm kiếm Trey Stout với bình luận Carl Meyer trên PATHEXT:

import os 
def exists_in_path(cmd): 
    # can't search the path if a directory is specified 
    assert not os.path.dirname(cmd) 

    extensions = os.environ.get("PATHEXT", "").split(os.pathsep) 
    for directory in os.environ.get("PATH", "").split(os.pathsep): 
    base = os.path.join(directory, cmd) 
    options = [base] + [(base + ext) for ext in extensions] 
    for filename in options: 
     if os.path.exists(filename): 
     return True 
    return False 

EDIT: Nhờ Aviv (trên blog của tôi) bây giờ tôi biết có một thực hiện Twisted: twisted.python.procutils.which

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