Python 显示完整消息时,使用子进程运行shell命令

Python 显示完整消息时,使用子进程运行shell命令,python,bash,shell,subprocess,Python,Bash,Shell,Subprocess,我想使用子流程从Python运行多个终端命令,同时不仅执行命令,而且还将终端中显示的输出完整地打印到我的stdout中,这样我就可以实时看到它(就像直接在终端中生成命令一样) 现在,使用建议,我能够从Python运行多个Bash命令: def subprocess_cmd(command): process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True) proc_stdout = process.co

我想使用
子流程从Python运行多个终端命令,同时不仅执行命令,而且还将终端中显示的输出完整地打印到我的stdout中,这样我就可以实时看到它(就像直接在终端中生成命令一样)

现在,使用建议,我能够从Python运行多个Bash命令:

def subprocess_cmd(command):
    process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
    proc_stdout = process.communicate()[0].strip()
    print(proc_stdout)

subprocess_cmd('echo a; echo b; cd /home/; ls')
输出:

b'a\nb\n<Files_in_my_home_folder>'
输出:

b'a\nb'
然而,错误信息应在终端中显示:

ls: option requires an argument -- 'w'
Try 'ls --help' for more information.
我想打印出终端中的任何内容(同时运行命令),不管命令是什么,无论它运行的是一些可执行文件,还是像
ls
这样的shell命令


我使用的是Python 3.7+,因此任何使用
subprocess.run
或类似方法的解决方案都是受欢迎的。但是,我不确定这会同时使用多个命令,也不确定使用
capture\u output=True,text=True
打印错误消息。

stdout=subprocess.PIPE
(或者包含此设置和一些相关设置的速记
capture\u output=True
)表示希望Python读取输出。如果您只是想让子流程将它直接打印的内容溢出到标准输出和/或标准错误中,那么您可以省去这个关键字参数

一如既往,如果可以避免,请不要使用
Popen
(通常,尽管在您的示例中这是不可能的)

subprocess.check_调用('echo a;echo b;cd/home/;ls',shell=True)

简单重申一下,这完全绕过了Python,并允许子流程在不需要Python参与或了解的情况下写入其(和Python的)标准输出和/或标准错误。如果您需要Python知道打印的内容,您需要让脚本捕获它,并在需要时让Python打印它。

谢谢,这对我很有用!可能值得写进一个我可以接受的答案中。如果您实际上不想捕获输出,请删除
capture=True
stdout
关键字标志,让进程自己写入stdout。(仍然建议不要使用bare
Popen
,除非您明确知道自己在做什么。)@tripleee“删除
capture=True
”是什么意思?我的代码示例不包括
capture=True
。也就是说,我对你所说的很感兴趣(即打印输出而不捕获输出),我在评论你的问题或你当时收到的答案之间有点分歧;
capture=True
引用了@python\u用户答案中的解决方案(当然,除了它实际上是编写的
capture\u output=True
,duh)。我现在发布了另一个答案,其中包含了更多的细节。谢谢,但我实际上想用Python将输出打印到我的标准输出。唯一的区别是我希望这种情况实时发生(这样我就可以在错误出现时看到它们),而不是在我调用存储的变量之后。是的,如果需要(接近)实时,您只能使用bare
Popen
。关于这一点,有几个常见问题。
ls: option requires an argument -- 'w'
Try 'ls --help' for more information.