2014-09-10 29 views
1

我正在处理一个脚本来调用I/O文件的可执行文件。我正在使用子进程,并试图将exe和stdout放到日志文件中。问题是我想输出一个简单的ASCII文件,我得到一个十六进制文件。只是真的学习编程python(或任何语言),所以我假设有一些我可以做的格式,但我不明白。我在本网站和其他网站上进行了一些搜索,但是我没有像使用子流程那样的东西。 “outRadcorr”是我最需要的帮助......任何想法?按要求提供更多代码。Python:将stdout写入日志文件;输出是十六进制不ascii

导入系统模块

import os, sys, string, traceback, time, datetime 
import params 
from subprocess import Popen, PIPE, STDOUT 

...一些代码在这里.....

写入标准输出到日志文件

rad_log_file = open(dsFolder + '\\radcorr.log', 'w') 

# loop through the files in raw file list to run radiometric correction 
for rawfiles in rawFolderList: 

    # Define the file base 
    rawBase = rawfiles.split(".")[0] 
    print ('\nProcessing file: %s \n')%(rawBase) 

    # define variables from raw file to process radcorr 
    radFile = rawfiles 
    pixFile = ('%s.pix')%(rawBase) 
    attFile = ('%s.att')%(rawBase) 

    # create windose bat file function 
    def rad_bat_writer(radcorr_bat): 
     with open(dsFolder + '\\radcorr.bat', 'a') as rad_bat_file: 
      rad_bat_file.write(radcorr_bat + '\n') 

    # grab radcor input/output files and run radcorr.exe 
    radcorr = ('C:\\itres\\bin\\radcorr.exe -f 1 -j 100 -g 50 -s -1 -n -1 %s %s %s -i '+ rawFolder + '\%s,rb -o ' + radFolder + '\%s -a ' \ 
    + radFolder + '\%s -c C:\\itres\\rad_cal_files\\%s -I 0 -v 0 -r Y -R Y -^^ 2') %(sum,scatter,shift,radFile,pixFile,attFile,rad_prefix) 
    # print out radcorr command 
    print radcorr 
    # Execute radcorr and write stdout 
    outRadcorr = Popen("{};".format(radcorr), stdout=PIPE, stderr=STDOUT) 
    for line in outRadcorr.stdout: 
     sys.stdout.write(line) 
     rad_log_file.write(line) 

    # write output to log 
    rad_bat_writer(radcorr) 

# Close out exe and log files 
outRadcorr.wait() 
rad_log_file.close() 
+0

我很困惑... radcorr.exe输出二进制到标准输出,你想改变它为文本格式?什么是在屏幕上打印? ...和rad_log_file不是文本? – tdelaney 2014-09-10 22:29:35

+0

您将同样的事情写入屏幕和日志文件。如何查看日志文件以查看它是“十六进制”的。 “十六进制”这个词是什么意思? – tdelaney 2014-09-10 23:18:44

+0

使用'r'C:\ itres \ bin \ radcorr.exe -f 1 -j 100 -g 50 -s -1 -n -1 {sum} {scatter} {shift} -i {radpath},rb -o {pixpath} -a {radFolder} \ {attFile} -c {rad_prefix_path} -I 0 -v 0 -r Y -RY - ^^ 2'.format(** vars())',其中'radpath = os。 path.join(rawFolder,radFile)','pixpath = os.path.join(radFolder,pixFile)'和'rad_prefix_path = os.path.join(r'C:\ itres \ rad_cal_files',rad_prefix)''。 – jfs 2014-09-13 02:07:57

回答

0

我用UltraEdit查看的文件,您可以在其中查看十六进制文件。我没有以十六进制模式查看。我可能会在这里混淆术语。在NotePad/NotePad ++ /写字板等文件看起来很正常。当我在调试模式下运行脚本,我可以按文件打循环文件。前两个文件(1GB /文件),输出日志看起来很好。一旦radcorr.log文件超过10kb,我将从正常的ascii输出更改为以十六进制格式显示的此二进制文件。我无法发布图片,但只是谷歌ultraedit十六进制。

仍然不确定为什么它移动到这种格式。最后,输出大小是45kb。我改变在UltraEdit中查看/编辑十六进制模式,它看起来很好。只是想知道它是否有任何想法,例如为什么当我指定日志为'w'而不是'wb'时。

我很感激你的帮助。 @ J.F。塞巴斯蒂安我必须测试你发布的代码,可能有助于解决潜在的错误。

相关问题