Tôi đang viết một tập lệnh Python chấp nhận đường dẫn tệp dưới dạng chuỗi, phân tích cú pháp, nối thêm tên lệnh và xây dựng danh sách, sau đó được chuyển đến subprocess.Popen()
để thực thi. Kịch bản này là để xử lý cả hai đường dẫn tập tin Unix và Windows, và cuối cùng nên chạy trên cả hai hệ thống.Làm thế nào để ngăn chặn tự động thoát các ký tự đặc biệt trong Python
Khi tôi chạy điều này trong Unix, nếu tôi cung cấp đường dẫn Windows vô tình chứa ký tự thoát (ví dụ: \Users\Administrator\bin
), Python sẽ giải thích ký tự không gian sau \b
. Tôi muốn ngăn điều đó xảy ra.
Theo như tôi biết, không có hàm hoặc phương thức nào biểu thị biến chuỗi dưới dạng chuỗi thô. Công cụ sửa đổi 'r'
chỉ hoạt động đối với các hằng số chuỗi.
Cho đến nay, gần nhất tôi đã có thể có được là thế này:
winpath = "C:\Users\Administrator\bin"
winpath = winpath.replace('\b','\\b')
winpathlist = winpath.split('\\')
Tại thời điểm này, winpathlist nên chứa ['C:','Users','Administrator','bin']
, không ['C','Users','Administrator\x08in']
.
tôi có thể thêm các cuộc gọi bổ sung cho winpath.replace()
để xử lý thoát khác tôi có thể nhận được - \a
, \f
, \n
, \r
, \t
, \v
- nhưng không \x
.
Có cách nào khác để làm điều này không?
Làm thế nào để bạn nhận được giá trị vào chuỗi? Python không nên coi \ b là một lối thoát trừ khi nó nằm trong chuỗi ký tự, hoặc được đưa vào chuỗi như là một lối thoát để bắt đầu. (Ngoài ra, dấu gạch chéo chuyển tiếp hoạt động tốt.) – geoffspear
@Wooble: Ngay bây giờ, nó đến qua doctest. >>> myCommandObject.setExcecutablePath ('C: \ Program Files \ cygwin \ cdrive \ bin') nơi myCommandObject chứa tên lệnh (ví dụ: 'ps'), đường dẫn và danh sách đối số. Thay đổi dấu gạch chéo từ dấu gạch chéo ngược sang dấu gạch chéo không phải là một tùy chọn; khách hàng của tôi đã tuyên bố rõ ràng rằng đây là những gì anh ta muốn. – poltr1
Như tôi đã nói, r chỉ hoạt động đối với các chuỗi ký tự; nó không hoạt động đối với các biến chuỗi. Tôi nhìn vào r hàng đầu như một kluge. Dù sao, đây là tài liệu (hoặc một phần của nó): >>> myCommand.setExecutablePath ('C: \ Program Files \ cygwin \ cdrive \ bin') >>> myCommandList = myCommand.getLaunchList() >> > myCommandList ['C: \\\\ Chương trình tập tin \\\ cygwin \\\ cdrive \\\\ \\\\', '-e', '-f'] >>> myCommandList [0] .split ("\\\\") ['C:', 'Tập tin chương trình', 'cygwin', 'cdrive', 'bin', 'ps'] Tôi không còn nhận được bất kỳ lỗi, bây giờ tôi đã thêm cuộc gọi để thay thế. – poltr1