如何将此过程输出到1)文本文件2)Python脚本



我想将以下过程的输出输送为1)到文本文件中或2)将其输送到另一个python脚本(直接处理它)

java -jar tools/PlayGame.jar tools/maps/8planets/map1.txt "python BullyBot.py" "python MinMaxBot.py" parallel | python tools/visualizer/visualize_locally.py

我很抱歉长期命令,但我不想遗漏信息。此命令至少具有必要的文件。

这是Visualize_locally.py文件的内容:

import re
import sys  
import os
import webbrowser
def generate(data, generated_path):
  path = os.path.dirname(__file__)
  template_path = os.path.join(path, 'index.php')
  template = open(template_path, 'r')
  content = template.read()
  template.close()
  php_re = re.compile(r"<?php.*??>", re.S)
  javascript = "var data = '%s';" % data
  content = php_re.sub(javascript, content)
  output = open(generated_path, 'w')
  output.write(content)
  output.close()
if __name__ == "__main__":
  data = raw_input()
  path = os.path.dirname(__file__)
  generated_path = os.path.realpath(os.path.join(path, 'generated.htm'))
  generate(data, generated_path)
  webbrowser.open('file://'+generated_path)

在java命令的参数给出的python文件中,使用以下日志函数:

def log(self, *args):
    lst=[]
    for arg in args:
        lst.append(str(arg))
    lst.append('n')#needed, otherwise line won't show in console
    sys.stderr.write(' '.join(lst))
    sys.stderr.flush()

我的终端窗口中可见的输出看起来像这样:

futuremaggel:PlanetWars supermaggel$ ./testbot.sh
Engine entering main game loop. Mode 'parallel'
Player 2: MIN score: 5.88349514563 
Player 2: MIN score: 6.26699029126 
Player 2: MIN score: 5.83495145631 
Player 2: MIN score: 5.48058252427 
Player 2: MIN score: 5.95145631068 
Player 2: MIN score: 6.44174757282 
Player 2: MIN score: 3.0 
Player 2: best move for MAX is thus: 6.44174757282 
Turn 1

testbot.sh shell脚本仅包含我问题开头提到的命令。我试图这样做:

java -jar tools/PlayGame.jar tools/maps/8planets/map1.txt "python BullyBot.py" "python MinMaxBot.py" parallel | python tools/visualizer/visualize_locally.py > gamelog.txt

不起作用的是,gamelog.txt之后是创建的,但是一个空文件。(我认为这是因为我在终端窗口中看到的输出是在运行时创建的 - 所以也许输出太快了,它错过了实际输出?)

我还尝试了此处的建议:bash饮食stderr输出,这里:http://www.cyberciti.biz/faq/faq/redirecting-stgerr-terr-to-stdout/

发布答案以避免填写评论。

如果您从

中获得输出
$ java -jar tools/PlayGame.jar tools/maps/8planets/map1.txt "python BullyBot.py" "python MinMaxBot.py" parallel | python tools/visualizer/visualize_locally.py 

在终端中。那可能意味着四件事之一。

  • 您从Java获得Stderr
  • 您从Python获得Stderr
  • 您从Python获得了Stdout
  • 您从Python那里得到了Stdout和Stderr的组合

您无法从Java那里得到Stdout,因为该管道被管道到Python,除非Python展示它,否则在您的终端中不会可见。

现在检查您是否从Java获得STDER,做

$ java -jar tools/PlayGame.jar tools/maps/8planets/map1.txt "python BullyBot.py" "python MinMaxBot.py" parallel 1>/dev/null

如果您看到任何东西以前比以前获得了stderr。

这意味着您有两种处理方法。如果您认为Python可以正确处理它,则可以将其插入Python,例如So

$ java -jar tools/PlayGame.jar tools/maps/8planets/map1.txt "python BullyBot.py" "python MinMaxBot.py" parallel 2>&1 | python tools/visualizer/visualize_locally.py &> output.txt

在这种情况下,output.txt将获得Python返回的所有输出。如果您认为Python会正确处理STDERR,则可以将其重定向到文件,然后将Python输出附加到它。

$ java -jar tools/PlayGame.jar tools/maps/8planets/map1.txt "python BullyBot.py" "python MinMaxBot.py" parallel 2>output.txt | python tools/visualizer/visualize_locally.py >> output.txt 2>&1

命令产生的两种输出文件类型:stdout和stderr。这是命令行定向的简短摘要。

命令>文件(将stdout转换为文件)

命令2&amp;> 1 (Catch stderr,使其成为Stdout的一部分)

命令|command2 (从命令中获取Stdout并将其转输给stdin for Command2)

命令>> file.txt (附加到现有文件)

我不知道cunivalize_locally.py的内容是什么,但是对于您必须使用的特定链条,它还需要打印通过stdin进入Stdout的任何内容?否则,Python脚本正在食用所有数据。确保其线条与此类似:

for line in sys.stdin:
  print line

* edit 我看到您用python文件的内容更新了帖子。看起来是的,python文件正在吃输出并将其写入其他地方,这很有意义,为什么您的gamelog.txt是空的。

如果您运行了确切的命令,但没有"> gamelog.txt",您是否看到某些东西被打印到屏幕上?

相关内容

  • 没有找到相关文章