python - 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
通过命令提示符执行命令时,它会给我一个有效的输出。
这怎么可能?
感谢您的帮助。
问候
解决方案
问题是check_output
如果命令失败,它不会产生命令的输出。
如果返回码不为零,则会引发 CalledProcessError。CalledProcessError 对象将在 returncode 属性中具有返回码,在输出属性中具有任何输出。
由于该网站不存在,因此该命令会返回一个错误,而您得到的只是一个 python 异常。如果您仍然想获得输出,请使用subprocess.Popen
or 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
(因此它使用与脚本相同的解释器运行)或查找是否无法导入模块并调用函数(避免产生子-处理/保留异常链)
推荐阅读
- android - 从底部导航按回时如何避免片段重新加载数据
- xml - XPath 选择没有“isNull”的值
- angular - 具有角 5 的引导网格系统
- sql - TSQL 填充数据
- javascript - Javascript 函数不会在 IE11 上构建 SVG
- javascript - 在 JavaScript 中将多维数组转换为 CSV 文件的列并使用浏览器书签保存
- ssh - 使用 gcloud 上的 vm 作为中介从任何地方访问本地服务器
- ansible - 使用动态库存文件(JSON)运行剧本
- angular - 未捕获(承诺中):TypeError:无法读取 null 的属性“eso”
- php - Google Search Console API 域权限