9

qから多数のジョブを削除したい。ジョブを削除するコマンドはqdel JOBid.

最初に subprocess モジュールを使用しようとしましたが、エラーが発生しました: #!/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)

したがって、これは機能しませんでした。私が得たエラーは

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

次に、サブプロセス行をコメントアウトして os を使用すると、すぐに機能しました。subprocess モジュールを完全には理解していないと思います

#!/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)

上記のコードは問題なく動作しました。subprocess モジュールの利点と理由を知りたいだけです。また、私はUNIXシェルを使用しています

4

3 に答える 3

3

manualを読むと、 への呼び出しが間違っていることがわかります。Popen単一のコマンドではなく、引数の配列を渡す必要があります。

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

または、sc0ttの回答が指摘しているように、を使用できますshell=Trueが、これにはより複雑な場合にいくつかの欠点があります。たとえば、スペースを含むファイル名など、コマンドにすべての変数データが​​含まれている場合は、コマンド内のすべての変数データを手動でエスケープする必要があります。潜在的に有害 ( など;)

于 2012-06-21T16:33:56.893 に答える
3

Popen 呼び出しで shell=True を使用したい。

p=sp.Popen(['qdel %d'%i], shell=True, stdout=sp.PIPE)
于 2012-06-21T16:25:46.657 に答える