2

In some shell script, you need to confirm "yes" to run the shell, well, an easier way is using "yes" and pipe, like this:

yes | test.py

then, you can run the shell script automatically without answer "yes" anymore. today, when i use this in python by trying : os.system("yes|**.sh"), i got an fault.

Here is my test.py file:

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

and run in shell by typing : python test.py. the fault information is : yes: standard output: Broken pipe yes: write error

but if i type "yes|read" in shell,it works well. may anyone tell me why?

4

2 回答 2

2

尝试这个

import os
def f():
    cmd1 = "echo 'yes' | read "
    os.system(cmd1)
f()
于 2013-08-21T13:17:20.620 回答
0

yes在管道关闭后继续尝试写入管道时,您在 shell 中运行的子进程也会收到“管道关闭”信号,但某些 shell 配置为捕获并忽略此错误,因此您看不到错误信息。无论哪种方式,它都是无害的。

不过,目前还不清楚您希望这段代码能完成什么。在子进程中运行read完全没有意义,因为执行的子进程read将立即退出。

如果你想yes重复打印,用 Python 本身就很容易做到。

while True:
    print('yes')

如果您想测试自己的程序,您可以更改代码,以便在启用调试标志的情况下运行时不需要交互式输入。无论如何,如果这是您的目标,那么您当前的方法是由内而外的;父(Python)进程将在子进程管道运行时等待。

(当你长大后,你会发现如何将输入作为命令行参数传递,这样你的脚本基本上就不需要交互式提示了。出于多种原因,这是一个更好的设计,但能够自动测试你的代码肯定是其中之一。)

于 2016-07-23T07:19:25.183 回答