Python 子进程 Popen
为什么不行呢?:|
import subprocess
p = subprocess.Popen([r"snmpget","-v","1","-c","public","-Oqv","","-Ln","192.168.1.1 1.3.6.1.2.1.2.2.1.10.7"],stdout=subprocess.PIPE).communicate()[0]
print p
运行脚本:
root@OpenWrt:~/python# python w.py
root@OpenWrt:~/python#
它输出了空行 :| 但是在同一台机器上,从命令行运行却可以:
root@OpenWrt:~/python# snmpget -v 1 -c public -Oqv -Ln 192.168.1.1 1.3.6.1.2.1.2.2.1.10.7
3623120418
我知道有“-Oqv”和“”,但是不加这个我在用snmpget的时候就会出错...
3 个回答
0
试着在 Popen 调用中加入一个 shell=True 的参数。
1
如果你想让从命令行运行的测试更像样,你需要做以下几点:
snmpget -v 1 -c public -Oqv '' -Ln "192.168.1.1 1.3.6.1.2.1.2.2.1.10.7"
...注意到在-Oqv
后面有空的引号,并且192.168.1.1
和1.3.6
在同一个参数里,这几乎肯定不是你想要的结果。
正如Greg所建议的,你应该把最后那个参数分成两个单独的部分,并去掉那个空字符串。
同时,你可以做一些简单的事情来改善错误处理:
- 记录退出状态。
- 记录错误输出的内容,并在非零退出时打印出来。
顺便说一下,适当增加一些空白并不一定是坏事,这样可以提高可读性。考虑一下下面的例子:
p = subprocess.Popen([
'snmpget',
'-v', '1',
'-c', 'public',
'-Oqv',
'-Ln',
'192.168.1.1 1.3.6.1.2.1.2.2.1.10.7'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = p.communicate()
if p.returncode != 0:
raise Exception('snmpget exited with status %r: %r' % (p.returncode. err)
2
我看到你的参数里有一个空字符串:
... ,"-Oqv","","-Ln", ...
^^
这可能会导致snmpget出现问题吗?
你这里还有两个参数合在一起了:
"192.168.1.1 1.3.6.1.2.1.2.2.1.10.7"
这个应该分成两个:
"192.168.1.1", "1.3.6.1.2.1.2.2.1.10.7"
在命令行输入命令时,系统会自动帮你分开参数。但是当你用这种方式调用 subprocess.Popen()
时,你就得自己把所有参数分开。如果你运行下面这个命令,也会出现同样的错误:
snmpget -v 1 -c public -Oqv -Ln '192.168.1.1 1.3.6.1.2.1.2.2.1.10.7'