打印Subprocess.Popen

时间:2018-03-19 20:10:38

标签: python subprocess stdout

我的功能Popen有问题。我尝试从我使用的命令中检索输出。

print(subprocess.Popen("dig -x 156.17.86.3 +short", shell=True, stdout=subprocess.PIPE).communicate()[0].decode('utf-8').strip())

此部分有效,但是当我在Popen内调用变量时(对于IP中的地址)

print(subprocess.Popen("dig -x ",Adres," +short", shell=True, stdout=subprocess.PIPE).communicate()[0].decode('utf-8').strip())

发生类似的事情:

raise TypeError("bufsize must be an integer")

我认为这会导致命令问题所以我使用了这个解决方案:

command=['dig','-x',str(Adres),'+short']
        print(subprocess.Popen(command, shell=True, stdout=subprocess.PIPE).communicate()[0].decode('utf-8').strip())

但现在返回值与console不同:

dig -x 156.17.4.20 +short
vpn.ii.uni.wroc.pl.

如何在脚本中打印上述名称? 非常感谢

1 个答案:

答案 0 :(得分:0)

错误是您没有传递单个字符串,而是传递多个单独的参数:

subprocess.Popen("dig -x ",Adres," +short", shell=True, stdout=subprocess.PIPE)

如果您查看the Popen constructor in the docs,则表示您将"dig -x"作为args字符串传递,将Adres作为bufsize传递,并传递{ {1}} "+short"。这绝对不是你想要的。

您可以通过构建带连接或字符串格式的字符串来解决此问题:

executable

然而,一个更好的解决方法是在这里不使用shell,并将参数作为列表传递:

subprocess.Popen("dig -x " + str(Adres) + " +short", shell=True, stdout=subprocess.PIPE)
subprocess.Popen(f"dig -x {Adres} +short", shell=True, stdout=subprocess.PIPE)

请注意,如果您这样做,则必须删除subprocess.Popen(['dig', '-x', Adres, '+short'], stdout=subprocess.PIPE) ,否则这将无效。 (它可能实际上可以在Windows上运行,但不能在* nix上运行,即使在Windows上也不应该这样做。)在你的问题的编辑版本中,你没有这样做,所以它是还是错的。

虽然我们正在使用它,但您真的不需要创建一个shell=True对象和Popen,如果这就是您正在做的事情。一个更简单的解决方案是:

communicate

另外,如果你在调试像你这样复杂的表达式时遇到问题,那么将它分成可以单独调试的单独部分(使用额外的print(subprocess.run(['dig', '-x', Adres, '+short'], stdout=subprocess.PIPE).stdout.decode('utf-8')) 或调试器断点)确实很有帮助:

print

这基本上是相同的,具有几乎相同的效率,但更容易阅读和更容易调试。

当我用proc = subprocess.run(['dig', '-x', Adres, '+short'], stdout=subprocess.PIPE) result = proc.stdout.decode('utf-8') print(result) 运行时,我得到你正在寻找的输出:

Adres = '156.17.4.20'