我想从q中删除一些作业.删除作业的命令是qdel JOBid.
最初,我尝试使用子进程模块,但是我收到了一个错误:#!/ 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)
Run Code Online (Sandbox Code Playgroud)
所以这没用.我得到的错误是
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
Run Code Online (Sandbox Code Playgroud)
然后我注释掉了子流程并使用了os,它立即起作用.我想我不完全理解子进程模块
#!/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)
Run Code Online (Sandbox Code Playgroud)
上面的代码完美无瑕.我只是想知道为什么以及子进程模块的优点是什么.另外,我使用的是unix shell
如果您阅读手册,您会发现您的调用Popen是错误的:您不应该传递单个命令,而是传递一组参数:
p=sp.Popen(['qdel', '%d'%i],stdout=sp.PIPE)
Run Code Online (Sandbox Code Playgroud)
或者,正如sc0tt 的回答指出的那样,您可以使用shell=True,但这在更复杂的情况下有一些缺点:您必须手动转义命令中的所有变量数据,以防它包含例如带空格的文件名或更多内容潜在有害(如;)
| 归档时间: |
|
| 查看次数: |
5181 次 |
| 最近记录: |