2013-10-02 58 views
1

我有以下代碼:運行可執行程序混淆解析/ OS

#!/usr/bin/python 
import sys 
import subprocess 
import random 
import time 

if len(sys.argv) != 7: 
    print "Usage: " + sys.argv[0] + " <executable> r m n p a" 
    sys.exit(1) 

myexecutable = sys.argv[1] 
r = int(sys.argv[2]) 
list_m = map(int, sys.argv[3].split(",")) 
list_n = map(int, sys.argv[4].split(",")) 
list_p = map(float, sys.argv[5].split(",")) 
list_a = map(int, sys.argv[6].split(",")) 

r1 = random.Random() 

for m in list_m: 
    for n in list_n: 
     for p in list_p: 
      for a in list_a: 
       if a <= m: 
        for i in range(r): 
         print '%04.3f' % (r1.randint(1, 100)) 
         seed = time.time() 
         r1 = random.Random(seed) 
         print m, n, p, a, i 
         command = myexecutable + " -seed "+ str(r1) + " -m "+ str(m) + " -n "+ str(n) +" -p "+ str(p) +" -a "+ str(a) 
         f = open("seed_" + str(r1) + "-m_" + str(m) + "-n_" + str(n) + "-p_" + str(p) + "-a_" + str(a)+ "-i_" + str(i) + ".xml", "w") 
         subprocess.call(command, shell=True, stdout=f) 
         f.close() 

「Myexecutable」是用C++編寫,不調用任何複雜的圖書館,除了提升選項的工作簡單的程序。一切似乎都很好。

當我運行

python generate.py 

下面的代碼我得到的奇特,不可思議的錯誤:

/bin/sh: 1: cannot open random.Random: No such file

如果我評論隨機相關線路,並把一個固定值R1然後我得到indendation錯誤以下(笑):

f = open("-s_" + str(r1) + "-m_" + str(m) + "-n_" + str(n) + "-p_" + str(p) + "-a_" + str(a)+ "-i_" + str(i) + ".xml", "w") ^IndentationError: unexpected indent

箭頭指向-a_所以它不可能是一個IND因爲它在線的中間對嗎?

因此,我清理我的項目,複製到不同的目錄,重拍,然後我重新運行腳本。現在,循環正常運行(控制檯輸出和創建的文件),但可執行似乎並沒有運行(文件爲空),並在每個循環迭代我仍然得到錯誤:

/bin/sh: 1: cannot open random.Random: No such file

AMO 如果我再次提出評論,如上所述,我得到了! :

Error: the argument ('eed') for option '--seed' is invalid

那麼這是一個明顯的內存泄漏(緩衝液/堆棧溢出)由C++可執行?

+0

如果你說'FNAME會發生什麼= 「seed_」 + STR(R1)+ 「-m_」 + STR(M)+「-n_ 「+ str(n)+」-p_「+ str(p)+」-a_「+ str(a)+」-i_「+ str(i)+」.xml「;打印fname;打開(fname,「w」);' –

+1

我沒有通讀你的python代碼,但我真的*懷疑它是一個「內存泄漏」或堆棧/緩衝區溢出或其他任何與C++你正在調用的代碼。 – yzt

回答

1

str(random.Random(3))返回'<random.Random object at 0x1783870>',所以我猜你正在尋找的是這樣的:

r1 = random.Random(seed) 
actual_random = r1.random() 
print(actual_random) # prints 0.08487199515892163 etc 
print(str(r.random()).split(".")[1]) # prints 08487199515892163 

爲identation閱讀pep8

也可能要concatinate字符串以這種方式,它看起來更乾淨。至少我是這麼喜歡:

lot_of_staff = [1,10,2,3,5,6,7,8] 
conc="".join([str(i) for i in lot_of_staff]) 
print(conc)# prints '110235678' 

list comprehensionsstring.join

+0

你說得對,我無法相信我是如何錯過這個的。非常感謝你。 – marina