【问题标题】:how to use os.system() in python for running an shell order如何在 python 中使用 os.system() 来运行 shell 命令
【发布时间】:2024-05-29 17:45:02
【问题描述】:

在某些 shell 脚本中,您需要确认“yes”才能运行 shell,嗯,更简单的方法是使用“yes”和管道,如下所示:

yes | test.py

然后,您可以自动运行 shell 脚本而无需再回答“是”。 今天,当我通过尝试在 python 中使用它时:os.system("yes|**.sh"),我遇到了一个错误。

这是我的 test.py 文件:

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

并通过键入:python test.py 在 shell 中运行。故障信息为: 是:标准输出:断管 是:写入错误

但是如果我在 shell 中输入“yes|read”,它就可以正常工作。 谁能告诉我为什么?

【问题讨论】:

  • 不要;使用subprocess 模块。

标签: python shell pipe os.system


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:

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

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

    如果你想重复打印yes,这在 Python 本身中很容易做到。

    while True:
        print('yes')
    

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

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

    【讨论】: