Chcę usunąć liczbę zleceń z q. Polecenie usunięcia zadania to qdel JOBid
.Dlaczego to polecenie działa z os.system(), ale nie z podprocesu.Popen()?
Początkowo próbowałem użyć modułu subprocess, ale mam błąd: #!/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)
Więc to nie działa. Błąd dostałam:
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
Potem skomentowałem linię podprocesu i użyłem OS i zadziałało natychmiast. Myślę, że nie w pełni rozumiem moduł podprocesu
#!/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)
Powyższy kod działał bezbłędnie. Chcę tylko wiedzieć, dlaczego i jakie są zalety modułu podprocesowego. Ponadto używam powłoki unixowej
Czy nadal nie musiałbyś jednak używać 'shell = True'? Jeśli nie określisz 'shell = True', czy Popen nie oczekuje, że pierwsza pozycja na liście argumentów będzie ścieżką programu do wykonania? – smont
@ sc0tt Od [strona man dla 'execvp'] (http://linux.die.net/man/3/execv): Funkcje' execlp() 'i' execvp() 'będą duplikować akcje shell w poszukiwaniu pliku wykonywalnego, jeśli podana nazwa pliku nie zawiera znaku ukośnika (/). – aland
@ sc0tt Przetestowałem jego odpowiedź i zadziałało. – ironcyclone