![](/img/trans.png)
[英]Python: How do I redirect output of os.system to python shell?
[英]How do I suppress output from a cat command that uses the os.system library in Python
我有一个 Python 3 程序,它使用 os 进程运行“cat”命令。
这是代码片段,它很棒,但所有 output 最终都出现在屏幕上。
os.system("cat *.txt | tee output.txt")
如何抑制 output 出现在屏幕上?
感谢您的任何帮助或建议。
tee
写入标准输出。 如果您不想写入标准输出,请不要使用tee
:
os.system("cat -- *.txt >output.txt")
如果您确实想使用tee
,您可以显式重定向它的标准输出:
os.system('cat -- *.txt | tee output.txt >/dev/null')
subprocess.run
和stdout=subprocess.DEVNULL
如果您不想修改 shell 命令以在其中添加重定向,则subprocess.run
为您提供足够的权限来指定在启动 shell之前执行的重定向:
import subprocess
subprocess.run('cat -- *.txt | tee output.txt', shell=True,
stdout=subprocess.DEVNULL)
tee
或subprocess.run
的 subprocess.run...但是如果您根本不使用 shell,它会更有效且更不容易出现安全问题:
import subprocess, glob
subprocess.run(['cat', '--'] + glob.glob('*.txt'),
stdout=open('output.txt', 'w'))
subprocess.run
,但没有 Shell If you're up for not using a shell at all, but your real-world use case unconditionally includes some analogue to tee
, the Python standard-library documentation describes how to accomplish this at https://docs.python.org/3 /library/subprocess.html#replacing-shell-pipeline ,如下所示:
import subprocess, glob
p1 = subprocess.Popen(['cat', '--'] + glob.glob('*.txt'), stdout=subprocess.PIPE)
p2 = subprocess.Popen(['tee', 'output.txt', stdin=p1.stdout, stdout=subprocess.DEVNULL)
p1.stdout.close()
p2.communicate()
您应该注意 os.system 使用的默认 shell
尝试执行此操作以检查后台使用的 shell:
python3 -c 'import os; os.system("ps $$")'
您可以稍微更改代码以强制 bash shell 并将 output 重定向到 /dev/null:
os.system('/bin/bash -c "cat *.txt | tee output.txt &>/dev/null"')
请注意,无论采用何种技术(您可以使用子进程模块),关键是背景 shell 和 output 重定向。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.