2012-07-30 26 views
6

Tôi đang sử dụng Python và Envoy. Tôi cần xóa tất cả các tệp trong một thư mục. Ngoài một số tệp, thư mục trống. Trong một thiết bị đầu cuối này sẽ là:Sử dụng rm * (ký tự đại diện) trong sứ giả: Không có tệp hoặc thư mục nào như vậy

rm /tmp/my_silly_directory/* 

Thông thường dictates rằng trong phái viên, điều này chuyển thành:

r = envoy.run('rm /tmp/my_silly_directory/*') 

Tuy nhiên:

r.std_err -> "rm: cannot remove `/tmp/my_silly_directory/*': No such file or directory" 

Đương nhiên có những lựa chọn thay thế cho việc sử dụng phái viên tại đây trường hợp, tôi chỉ đơn giản là tự hỏi tại sao nó không hoạt động.

Bất kỳ manh mối nào?

Trả lời

5

Trên UNIX, tùy thuộc vào trình bao để diễn giải các ký tự đại diện như *. Nếu bạn thực hiện một chương trình và vượt qua một đối số với * trong nó trực tiếp đến chương trình - đó là có lẽ những gì đang được thực hiện ở đây - sau đó bạn sẽ nhận được một lỗi như bạn đang nhìn thấy. rm chỉ giả định * là tên tệp và thực tế, có thể tạo một tệp như vậy.

Một giải pháp có thể để thực hiện vỏ và để cho nó thực hiện lệnh của bạn thay cho bạn, một cái gì đó giống như

r = envoy.run('sh -c "rm /tmp/my_silly_directory/*"') 

Các vỏ sẽ giải thích * trước khi gọi rm.

+0

Điều này nghe hoàn toàn đúng và có thể sẽ hoạt động với quy trình con. Tuy nhiên, trong sứ giả, cuộc gọi duy nhất hoạt động là 'envoy.run ([[" sh "," -c "," rm/tmp/my_silly_directory/* "]])' vì một lý do nào đó. Vì vậy, rất nhiều cho một đơn giản 'subprocess';) –

+0

không thể có được điều này để làm việc với subprocess, bằng cách này. Lỗi tương tự như câu hỏi gốc. – Nate

+0

@Nate: ['shutil.rmtree ('/ tmp/my_silly_directory /')'] (http://stackoverflow.com/questions/9106350/how-to-use-wildcards-with-envoy?lq=1#comment15551439_9109127) – jfs

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