获取Python脚本以便每次都运行二进制文件

时间:2016-08-19 05:59:45

标签: python

我正在使用python脚本在终端中运行命令。我有一个C,numgen的程序,它应该随机生成数字。编译numgen之后,我会在不同的架构上模拟运行numgen。

要输入命令行的文本:

cmd= "~/simdir/build/ALPHA/gem5.opt ~/simdir/configs/example /se.py   ~/First/NumGen/numgen -o   " 

然后我使用以下命令在子shell中运行命令

for x in range(5): //number of simulations
os.system(run)//run is cmd plus a string I created using a for loop because se.py requires an argument

我遇到了一个问题。运行完所有内容后,我使用result_file.write()将有关numgen的相关数据输出到文件中。这很好,除了这个新文件中的所有输出都是相同的。 numgen程序在C中,用于生成随机数。它做得很好,当我在终端运行二进制文件./numgen时,我得到了随机数列表。

在脚本中,似乎os.system每次都没有在子shell中运行二进制文件。 Os.system在开始时运行二进制文件,并为其余模拟打印出相同的数据。有谁知道我怎么能让数据真正随机?我希望在每次模拟之前运行二进制文件,以便生成的数据可以不同。是否可以在脚本中执行此操作?我在脚本中有编译标志和其他文本,但我不认为那些与上述代码有关的问题。

基本上,os.system对所有模拟都运行一次二进制。我想知道是否可以为每个不同的模拟运行二进制文件。任何帮助表示赞赏。感谢

编辑1-完整脚本:

from random import * 
from array import *
import sys, string, os, subprocess, shlex, binascii, collections, operator 
import re
import subprocess


plaintext = array('B', [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]); 

loop = long(0); 
loop_max = long(1000); 
number = long(0); 
byte_index = 0; 

cmd = "~/simdir/build/ALPHA/gem5.opt ~/simdir/configs/example /se.py   --num-cpus=1 --caches --l2cache --cpu-type=timing --cacheline_size=64  --l1d_size=32kB --l1d_assoc=2 --l1i_size=32kB --l1i_assoc=4 --l2_size=1MB --l2_assoc=2  --max-checkpoints=200 -c ~/First/NumGen/numgen -o  " 


string="" 

Somekeywords = ['sim_freq','sim_ticks','host_mem_usage', 'system.cpu.numCycles', 'host_seconds',  'sim_insts' ]

table = [[0 for first in range(26)] for second in range(loop_max)]; #16 for plaintext bytes, 1 for ticks, 9 for L1D/L1I/L2 miss/hit/access
result =[[0 for first in range(26)] for second in range(loop_max)];

outfile = stats_text = open('Data.txt', 'w') 



stats_text=open('RelStat', 'w')

numb=10


for x in range(numb): 



    number=number+1
    outfile.write('%d\n' % number)

    run = ""
    string= ""
    final_str = ""

    for x in range(16): 
       plaintext[i] = randint(0, 255) 

    tmp = ""

    #Dec -> HEX -> Str
    for x in range(16):
        tmp = hex(plaintext[i])[2:] 
        if len(tmp)==1:
            tmp = "0"+tmp 

        string = string + tmp 


    run = cmd + string 


    subprocess.Popen(run, shell=True).wait() #Just changed this previously used os.system(run)

    stats_text = open('newdir/analysis.txt', 'r') 


    count = 0;
    for line in stats_text: 
        for index in range(3): 
            if Somekeywords[index] in line: 

                count = count + 1; #    
        line=re.sub('[^0-9]',' ', line) 
        outfile.write(line)
        outfile.write("\n")




                if count>10 and count<21: 
                    result_tmp = re.findall(r'\b\d+\b',line); 
                    print(loop);
                    result[loop][16+index] = int(result_tmp[0]);



    for i in range(16):
        result[loop][i] = plaintext[i];

    loop = loop + 1;

    if loop == loop_max:
        loop = 0;

        for i in range(loop_max):
            for j in range(26):
                final_str = final_str + str(result[i][j]) + ' '; 

outfile.write("\n")


outfile.close

编辑2 - Numgen

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main()
{
    FILE *of1;
    of1=fopen("Data.txt", "w");
    srand(time(NULL));
    for (int z=0; z<16; z++)
    {
        int numgen=rand()%100;
        fprintf(of1, "%d ", numgen);
    }
    fclose(of1);
}

只是一个生成随机数的快速程序。此外,程序是C,而不是我之前说过的C ++。我一定是用gcc编译.cpp而没注意到。

0 个答案:

没有答案