Ignoring output from subprocess.Popen(忽略 subprocess.Popen 的输出)
问题描述
我正在从我的 Python 脚本调用一个 java 程序,它输出了很多我不想要的无用信息.我已经尝试将 stdout=None 添加到 Popen 函数中:
I am calling a java program from my Python script, and it is outputting a lot of useless information I don't want. I have tried addind stdout=None to the Popen function:
subprocess.Popen(['java', '-jar', 'foo.jar'], stdout=None)
但它也是一样的.有什么想法吗?
But it does the same. Any idea?
推荐答案
来自 3.3 文档:
stdin、stdout 和 stderr 分别指定执行程序的标准输入、标准输出和标准错误文件句柄.有效值为 PIPE、DEVNULL、现有文件描述符(正整数)、现有文件对象和无.
stdin, stdout and stderr specify the executed program’s standard input, standard output and standard error file handles, respectively. Valid values are PIPE, DEVNULL, an existing file descriptor (a positive integer), an existing file object, and None.
所以:
subprocess.check_call(['java', '-jar', 'foo.jar'], stdout=subprocess.DEVNULL)
这仅存在于 3.3 及更高版本中.但是文档说:
This only exists in 3.3 and later. But the documentation says:
DEVNULL 表示将使用特殊文件 os.devnull.
DEVNULL indicates that the special file os.devnull will be used.
而 os.devnull 可以追溯到 2.4(在 subprocess 存在之前).因此,您可以手动执行相同的操作:
And os.devnull exists way back to 2.4 (before subprocess existed). So, you can do the same thing manually:
with open(os.devnull, 'w') as devnull:
    subprocess.check_call(['java', '-jar', 'foo.jar'], stdout=devnull)
请注意,如果您正在做一些不适合一行的更复杂的事情,您需要在 Popen 的整个生命周期内保持 devnull 处于打开状态对象,而不仅仅是它的构造.(也就是说,将整个内容放在 with 语句中.)
Note that if you're doing something more complicated that doesn't fit into a single line, you need to keep devnull open for the entire life of the Popen object, not just its construction. (That is, put the whole thing inside the with statement.)
重定向到 /dev/null (POSIX) 或 NUL: (Windows) 的优点是您不会创建不必要的管道,更重要的是,不能遇到子进程在写入该管道时阻塞的极端情况.
The advantage of redirecting to /dev/null (POSIX) or NUL: (Windows) is that you don't create an unnecessary pipe, and, more importantly, can't run into edge cases where the subprocess blocks on writing to that pipe.
缺点是,理论上,subprocess 可能在某些os.devnull 不具备的平台上工作.如果您只关心 POSIX 和 Windows、PyPy 和 Jython(大多数人)上的 CPython,那么这永远不会成为问题.对于其他情况,请在分发代码之前进行测试.
The disadvantage is that, in theory, subprocess may work on some platforms that os.devnull does not. If you only care about CPython on POSIX and Windows, PyPy, and Jython (which is most of you), this will never be a problem. For other cases, test before distributing your code.
这篇关于忽略 subprocess.Popen 的输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:忽略 subprocess.Popen 的输出
				
        
 
            
        基础教程推荐
- PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
 - 包装空间模型 2022-01-01
 - 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
 - PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
 - 修改列表中的数据帧不起作用 2022-01-01
 - 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
 - 在Python中从Azure BLOB存储中读取文件 2022-01-01
 - 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
 - Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
 - 求两个直方图的卷积 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
				
				
				
				