Python 子进程 Popen

1 投票
3 回答
6014 浏览
提问于 2025-04-16 08:45

为什么不行呢?:|

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.11.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'

撰写回答