2012-06-21 27 views
5

Tôi muốn xóa một số công việc khỏi q. Lệnh xóa lệnh là qdel JOBid.Tại sao lệnh này làm việc với os.system() nhưng không phải là subprocess.Popen()?

Ban đầu, tôi cố gắng sử dụng các mô-đun subprocess, nhưng tôi đã nhận ra lỗi: #/usr/bin/env python

import sys, os, subprocess as sp 

lo = sys.argv[1] 
hi = sys.argv[2] 

lo = int(lo) 
hi = int(hi) 


for i in range(lo,hi): 
    print "i is %d"%i 
    p=sp.Popen(['qdel %d'%i],stdout=sp.PIPE) 
    #os.system('qdel %d'%i) 

Vì vậy, điều này không làm việc. Lỗi tôi nhận được là

Traceback (most recent call last): 
File "del.py", line 14, in <module> 
p=sp.Popen(['qdel %d'%i],stdout=sp.PIPE) 
File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__ 
errread, errwrite) 
File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child 
raise child_exception 
OSError: [Errno 2] No such file or directory 

Sau đó, tôi nhận xét ra dòng xử lý con và đã sử dụng hệ điều hành và nó hoạt động ngay lập tức. Tôi nghĩ rằng tôi không hiểu đầy đủ mô-đun quy trình phụ

#!/usr/bin/env python 

import sys, os, subprocess as sp 

lo = sys.argv[1] 
hi = sys.argv[2] 

lo = int(lo) 
hi = int(hi) 


    for i in range(lo,hi): 
     print "i is %d"%i 
     #p=sp.Popen(['qdel %d'%i],stdout=sp.PIPE) 
     os.system('qdel %d'%i) 

Đoạn mã trên hoạt động hoàn hảo. Tôi chỉ muốn biết lý do tại sao và những lợi thế của mô-đun subprocess. Ngoài ra, tôi đang sử dụng một vỏ unix

Trả lời

3

Nếu bạn đọc manual, bạn có thể thấy rằng cuộc gọi của bạn để Popen là sai: bạn phải vượt qua không phải là một lệnh duy nhất, nhưng một mảng các đối số:

p=sp.Popen(['qdel', '%d'%i],stdout=sp.PIPE) 

Ngoài ra, như sc0tt's answer points out , bạn có thể sử dụng shell=True, nhưng điều này có một số nhược điểm trong trường hợp phức tạp hơn: bạn sẽ phải tự thoát tất cả dữ liệu biến trong lệnh trong trường hợp nó chứa, ví dụ: tên tệp có dấu cách hoặc bất kỳ thứ gì có khả năng gây hại (như ;)

+0

Bạn vẫn không được yêu cầu sử dụng 'shell = True'? Nếu bạn không chỉ định 'shell = True' không Popen mong đợi mục đầu tiên trong danh sách các đối số là đường dẫn của chương trình để thực hiện? – smont

+1

@ sc0tt Từ [man-page cho 'execvp'] (http://linux.die.net/man/3/execv): Các hàm' execlp() 'và' execvp() 'sẽ lặp lại các hành động của vỏ trong việc tìm kiếm tệp thực thi nếu tên tệp được chỉ định không chứa ký tự gạch chéo (/). – aland

+0

@ sc0tt Tôi đã thử nghiệm câu trả lời của mình và nó đã hoạt động. – ironcyclone

2

Bạn muốn sử dụng shell = True trên cuộc gọi Popen của mình.

p=sp.Popen(['qdel %d'%i], shell=True, stdout=sp.PIPE) 
+0

Vì vậy, nếu vỏ là sai, sau đó nó đã cố gắng để thực hiện lệnh? – ironcyclone

+0

@ Chris2021 Với 'shell = False', nó chỉ chạy quá trình với [' os.execvp() '] (http://docs.python.org/library/os.html#os.execvp). Với 'shell = True', nó gọi shell mặc định của bạn và làm cho nó thực hiện chuỗi được cung cấp. – aland

+0

@aland Cảm ơn bạn. – ironcyclone

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