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