Python 使用';启动';

Python 使用';启动';,python,file,subprocess,call,stdout,Python,File,Subprocess,Call,Stdout,我试图将一个从python脚本打开的shell窗口的输出重定向到一个文件 所以,在谷歌搜索之后,我想出了以下代码: file_output = open(MS_Log + 'LOGS.txt', 'w+') subprocess.call('start ' + URL_logs, shell=True, stdout=file_output) 这确实会打开一个新的shell窗口并在其中运行我想要的命令。但是,输出将打印在屏幕上(在新的shell窗口中),而不是打印到文件中 我希望它既可以在sh

我试图将一个从python脚本打开的shell窗口的输出重定向到一个文件

所以,在谷歌搜索之后,我想出了以下代码:

file_output = open(MS_Log + 'LOGS.txt', 'w+')
subprocess.call('start ' + URL_logs, shell=True, stdout=file_output)
这确实会打开一个新的shell窗口并在其中运行我想要的命令。但是,输出将打印在屏幕上(在新的shell窗口中),而不是打印到文件中

我希望它既可以在shell窗口中打印,也可以保存到文件中


现在,我在那里运行的命令是连续的,它一直运行到用Ctrl+C停止,所以我认为这可能是问题所在。。。?如果它被优雅地关闭,可能会将其内容转储到文件中?

您可以尝试将输出保存在变量中,然后将其写入文件:

process = subprocess.Popen(command, stdout = subprocess.PIPE, shell = True)
(process_output,  error) = process.communicate()
file = open(path_of_file_output, "w")
file.write(process_output)
file.close()

哦,我改编了一个很好的解决方案

它应该在终端中显示命令的输出,并在运行时将其保存到文件中。这意味着它也适用于无限循环。它不使用让您接受shell注入的
shell=True
选项(如果您不只是在家中的LAN上玩,请始终对使用
shell=True
的脚本设置严格的权限)。 该解决方案有一个缺点:只有在输出中有换行符时才有效;否则,将不会打印/写入任何内容

import subprocess

""" continuously print command output and append it to file while running """

def run(command):    
    popen = subprocess.Popen(command, stdout=subprocess.PIPE)
    return iter(popen.stdout.readline, b"")

filename = "subprocess_output"
f = open(filename, "a")

for line in run(["/bin/bash", "infinite_loop.sh"]):
    print(line), # the comma keeps python from adding an empty line
    f.write(line)

f.close()

也许可以添加一行关于为什么
shell=True
可能是安全问题的内容?他希望输出显示在终端中,如果您不想显示您输入的输出
shell=False
和solvedThanks@Miguel Jiménez。我尝试了这段代码(用一个简单的echo,而不是一个复杂的命令,所以我可以确定它结束了),但它仍然没有写入文件
process=subprocess.Popen('start echo hello',stdout=subprocess.PIPE,shell=True)(process\u output,error)=process.communicate()file=open('LOGS.txt',w')file.write(process\u output)file.close()
为什么要写
start echo hello
?您只写
echo hello
。Popen execute terminal commands,这里的单词“start”不正确。@MiguelJiménez OP似乎在Windows系统上,
start
是一个有效的命令,可以启动外部进程/程序。我使用的是*nix系统,我想你也是,因为
echo hello
在shell/bash中是有效的。@Daniel Sanchez我是这样做的,如果你通读一遍,你会发现我自己做了搜索,试着编写代码,并说了实际发生的情况和我想要实现的情况。重点更明确的问题:谢谢,我将在几分钟内尝试并更新结果!这确实创建了一个文件并写入其中,但是,当我在命令提示符中添加“start”时(打开一个新的CMD窗口需要它),它就会停止工作。我想我可能只是使用这个解决方案(如果我不知道如何让它像我想要的那样工作),只需弹出一个仅用于显示目的的CMD窗口,即我将在新的CMD窗口中运行两次命令,有一次,我打开了新窗口,只是为了保存输出。@AlexyGrabov可能有办法,但我仍然没有找到完美的解决方案。另一方面,为什么需要打开另一个终端窗口,而不是将输出保存在运行脚本的窗口中?因为我想打开3-4个窗口,并在所有窗口中显示不同的滚动日志。如果我在一个窗口中执行此操作,它将很混乱:)