Python os.system 没有输出
Posted
技术标签:
【中文标题】Python os.system 没有输出【英文标题】:Python os.system without the output 【发布时间】:2011-08-01 14:24:14 【问题描述】:我正在运行这个:
os.system("/etc/init.d/apache2 restart")
它应该重新启动网络服务器,就像我直接从终端运行命令一样,它会输出:
* Restarting web server apache2 ...
waiting [ OK ]
但是,我不希望它在我的应用程序中实际输出。我怎样才能禁用它? 谢谢!
【问题讨论】:
os.system("/etc/init.d/apache2 restart >/dev/null")
将丢弃该输出。正如 Noufal 所说,subprocess
是首选。但是,如果您想快速调整现有代码,重定向到 /dev/null 可能是一个有吸引力的选择。
@kirk:为什么是评论而不是答案?
@mb14:我认为它不像使用 subprocess 的建议那样“正确”。我认为这更像是一个旁注,比如“虽然我并不完全建议你这样做,但这是另一个想法。”
相关:How to hide output of subprocess in Python 2.7
这对我有用,因为我正在寻找适用于 python 2 和 3 的东西。
【参考方案1】:
您应该使用subprocess
模块,您可以使用该模块以灵活的方式控制stdout
和stderr
。 os.system
已弃用。
subprocess
模块允许您创建一个表示正在运行的外部进程的对象。您可以从它的 stdout/stderr 读取它,写入它的 stdin,发送信号,终止它等。模块中的主要对象是 Popen
。还有很多其他方便的方法,例如调用等。docs 非常全面,包括section on replacing the older functions (including os.system
)。
【讨论】:
太棒了。谢谢回答。它会是哪个功能?文档让我感到困惑。称呼?弹出? +10 表示不完整的答案!这表明投票和质量不能齐头并进:-)。 Noufal,您可以提及差异。popen
但您应该花一些时间阅读文档。我想你只是略过它们。他们真的很清楚。
您是否有来源明确将其标记为已弃用,而不是“不推荐”? Guido 被记录在案,反对将其移除。我不同意您的回答- subprocess 好多了! - 只是澄清一点。
Guido 通常反对更改标准库。 docs for os.system
表示“首选”使用子进程。【参考方案2】:
根据你的操作系统(这就是为什么正如 Noufal 所说,你应该使用 subprocess 代替)你可以尝试类似
os.system("/etc/init.d/apache restart > /dev/null")
或(也可以忽略错误)
os.system("/etc/init.d/apache restart > /dev/null 2>&1")
【讨论】:
【参考方案3】:一定要避免os.system()
,而是使用子进程:
with open(os.devnull, 'wb') as devnull:
subprocess.check_call(['/etc/init.d/apache2', 'restart'], stdout=devnull, stderr=subprocess.STDOUT)
这是subprocess
等效于/etc/init.d/apache2 restart &> /dev/null
。
有subprocess.DEVNULL
on Python 3.3+:
#!/usr/bin/env python3
from subprocess import DEVNULL, STDOUT, check_call
check_call(['/etc/init.d/apache2', 'restart'], stdout=DEVNULL, stderr=STDOUT)
【讨论】:
+1 是一个实际示例,展示了如何使用subprocess
解决 OPs 问题。 :)【参考方案4】:
这是我几年前拼凑起来的一个系统调用函数,并在各种项目中使用过。如果您根本不想要命令的任何输出,您可以只说 out = syscmd(command)
,然后对 out
不执行任何操作。
在 Python 2.7.12 和 3.5.2 中测试并运行。
def syscmd(cmd, encoding=''):
"""
Runs a command on the system, waits for the command to finish, and then
returns the text output of the command. If the command produces no text
output, the command's return code will be returned instead.
"""
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
close_fds=True)
p.wait()
output = p.stdout.read()
if len(output) > 1:
if encoding: return output.decode(encoding)
else: return output
return p.returncode
【讨论】:
【参考方案5】:我在使用 Windows 机器时遇到了类似的问题,发现这是解决问题的最简单方法
import subprocess
cmd='gdalwarp -overwrite -s_srs EPSG:4283 -t_srs EPSG:28350 -of AAIGrid XXXXX.tif XXXXX.asc'
subprocess.run(cmd,shell=True)
将cmd
更改为您想要运行的任何内容。我重复了 > 1000 次,并且没有出现命令提示符窗口,我能够节省大量时间。
【讨论】:
以上是关于Python os.system 没有输出的主要内容,如果未能解决你的问题,请参考以下文章
python 使用 os.system() 时没有返回正常的结果,返回了256 ubuntu16.04系统下 python版本 2.7.11
Python:如何保存 os.system 的输出 [重复]
Python:运行 os.system 后如何获取标准输出? [复制]