2010-04-22 69 views
6

Có những lần tôi tự động tạo các kịch bản shell nhỏ từ Python, và tôi muốn đảm bảo rằng các đối số tên tệp không chứa ký tự đặc biệt không thoát. Tôi đã tung ra giải pháp của riêng mình, rằng tôi sẽ cung cấp như một câu trả lời, nhưng tôi gần như chắc chắn tôi đã nhìn thấy một chức năng như vậy bị mất ở đâu đó trong thư viện chuẩn. Bởi “mất” Tôi có nghĩa là tôi không tìm thấy nó trong một mô-đun rõ ràng như shlex, cmd hoặc subprocess.Trích dẫn các ký tự đặc biệt shell POSIX trong đầu ra Python

Bạn có biết chức năng như vậy trong stdlib không? Nếu có, nó ở đâu?

Ngay cả câu trả lời phủ định (nhưng chắc chắn và chính xác :) sẽ được chấp nhận.

+1

có thể trùng lặp của [Cách tốt nhất để thoát os.system() gọi bằng Python là gì?] (Http://stackoverflow.com/questions/35817/whats-the-best-way-to-escape-os- system-calls-in-python) - Mặc dù người khác đang nói về os.system và điều này không phải là, nó là cùng một trích dẫn cho cùng một mục đích. Và nó có cùng câu trả lời. –

Trả lời

6

pipes.quote():

>>> from pipes import quote 
>>> quote("""some'horrible"string\with lots of junk!$$!""") 
'"some\'horrible\\"string\\\\with lots of junk!\\$\\$!"' 

Mặc dù lưu ý rằng nó được cho là có một lỗi nơi một arg zero-length sẽ trở lại không có gì:

>>> quote("") 
'' 

Có lẽ nó sẽ là tốt hơn nếu nó trở '""'.

+0

Vâng, cảm ơn bạn! Và nó nằm trong một mô-đun rõ ràng (đối với người dùng POSIX), vì vậy tôi đã nhầm lẫn. – tzot

+0

Đôi khi 'subprocess.list2cmdline' cũng hữu ích; nó không * không * thoát vỏ metachars nhưng không xử lý thoát trích dẫn và thoát không gian, do đó, nó khá tốt khi bạn muốn * để gọi một vỏ từ xa nhưng nó đi qua một hoặc nhiều lớp bổ sung de-thoát trên đường, như thông qua 'ssh' lệnh gọi từ xa. –

1

Chức năng tôi sử dụng là:

def quote_filename(filename): 
    return '"%s"' % (
     filename 
     .replace('\\', '\\\\') 
     .replace('"', '\"') 
     .replace('$', '\$') 
     .replace('`', '\`') 
    ) 

đó là: Tôi luôn luôn kèm theo tên tập tin trong dấu ngoặc kép, và sau đó trích dẫn các nhân vật chỉ đặc biệt bên trong dấu ngoặc kép.

+0

Không phải là nó tức giận khi bạn đặt một câu hỏi chỉ để trả lời nó, và đó là một sự lừa đảo ngay từ đầu? : P (Đã xảy ra với tôi gần đây.) –

+0

@Roger: Hell. Cơ chế tìm kiếm của SO cần cải tiến. Tôi * đã * tìm kiếm câu trả lời trước khi hỏi. Lưu ý rằng câu trả lời của tôi không bao giờ có ý định được chọn là câu trả lời *. Tôi cũng đã bỏ phiếu cho việc đóng câu hỏi. – tzot

+0

[Thật vậy, nó.] (Http://meta.stackexchange.com/questions/42878/show-related-questions-just-before-question-submission) Tôi đã không cố gắng nói bất cứ điều gì xấu về yêu cầu của bạn câu hỏi (nó thậm chí có thể khó tìm kiếm cho đến sau khi tất cả các quy trình suy nghĩ đi vào viết và đăng), chỉ cần cố gắng chia sẻ sự thất vọng. –

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