我想将以下过程的输出输送为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",您是否看到某些东西被打印到屏幕上?