如何在Python中使用os.system()运行shell命令

3
在一些shell脚本中,你需要确认“yes”来运行该脚本,而更简单的方法是使用“yes”和管道,像这样:
yes | test.py

然后,您就可以自动运行shell脚本而无需再回答“是”的问题了。今天,当我尝试在Python中使用以下方法:os.system("yes|**.sh")时,出现了错误。

这是我的test.py文件:

import os
def f():
    cmd1 = "yes | read "          
    os.system(cmd1)
f()

并在shell中输入:python test.py 运行。错误信息为: yes: 标准输出:Broken pipe yes: 写入错误

但是如果我在shell中输入 "yes|read",它可以正常工作。 有人能告诉我为什么吗?


不要使用 subprocess 模块。 - Wooble
2个回答

2

试一下

import os
def f():
    cmd1 = "echo 'yes' | read "
    os.system(cmd1)
f()

1
在shell中运行的子进程在管道关闭后继续尝试向管道写入时也会收到“管道关闭”信号,但某些shell被配置为捕获和忽略此错误,因此您看不到错误消息。无论哪种方式,都是无害的。
不过,不清楚您希望此代码实现什么;在子进程中运行read毫无意义,因为执行read的子进程将立即退出。
如果您想重复打印yes,在Python本身中很容易实现。
while True:
    print('yes')

如果您想测试自己的程序,您可以更改代码,以便在启用调试标志时不需要交互式输入即可运行。无论如何,如果这是您的目标,您当前的方法都是从内部向外的; 父(Python)进程将等待子进程管道运行。
(当您长大后,您会发现如何将输入作为命令行参数传递,以便您的脚本基本上永远不需要交互提示。出于许多原因,这是更好的设计,但能够自动化测试代码肯定是其中之一。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接