首页 > 解决方案 > subprocess.check_output 函数的行为问题

问题描述

我的代码是:

import subprocess

answer = subprocess.check_output("python ../pydig/pydig @1.1.1.1 +tls=noauth goowdqdqdqdgle.de A",  encoding='utf8')
print (answer)

Pydig 是一个用于查找域名的库。我遇到的问题是当我执行这个程序时它告诉我一个 subprocess.CalledProcessError:

subprocess.CalledProcessError: Command 'python ../pydig/pydig @1.1.1.1 +tls=noauth goowdqdqdqdgle.de A' returned non-zero exit status 3.

但是当我pydig @1.1.1.1 +tls=noauth goowdqdqdqdgle.de A通过命令提示符执行命令时,它会给我一个有效的输出。

这怎么可能?

感谢您的帮助。

问候

标签: pythonsubprocessoutput

解决方案


问题是check_output如果命令失败,它不会产生命令的输出。

如果返回码不为零,则会引发 CalledProcessError。CalledProcessError 对象将在 returncode 属性中具有返回码,在输出属性中具有任何输出。

由于该网站不存在,因此该命令会返回一个错误,而您得到的只是一个 python 异常。如果您仍然想获得输出,请使用subprocess.Popenor subprocess.run(python 3.5+) 和输出/错误重定向。

也总是使用参数列表,而不是字符串。

示例Popen

handle = subprocess.Popen(["python","../pydig/pydig","@1.1.1.1","+tls=noauth","goowdqdqdqdgle.de","A"], stdout=subprocess.PIPE,stderr=subprocess.PIPE  encoding='utf8')
out,err = handle.communicate()
return_code = handle.wait()
print(return_code,out.decode(),err.decode())

请注意,由于要运行的命令是 python 代码,您可以将第一个"python"参数替换为sys.executable(因此它使用与脚本相同的解释器运行)或查找是否无法导入模块并调用函数(避免产生子-处理/保留异常链)


推荐阅读