gpt4 book ai didi

python - 为什么此命令适用于 os.system() 但不适用于 subprocess.Popen()?

转载 作者:太空狗 更新时间:2023-10-29 21:06:04 25 4
gpt4 key购买 nike

我想从 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 shell

最佳答案

如果您阅读 manual ,您可以看到对 Popen 的调用是错误的:您不应传递单个命令,而应传递参数数组:

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

或者,作为 sc0tt's answer指出,您可以使用 shell=True,但这在更复杂的情况下有一些缺点:您必须手动转义命令中的所有变量数据,以防它包含例如文件名空格或任何更可能有害的东西(如 ;)

关于python - 为什么此命令适用于 os.system() 但不适用于 subprocess.Popen()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11142485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com