我正在使用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而没注意到。