通过python运行可执行文件会混淆解释器/操作系统

时间:2013-10-02 22:41:53

标签: python shell interpreter

我有以下代码:

#!/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:无法打开random.Random:没有这样的文件

如果我评论随机相关的行并将固定值放到r1然后我得到了(lol)之后的压痕错误:

  

f = open(“ - s_”+ str(r1)+“ - m_”+ str(m)+“ - n_”+ str(n)+“ - p_”+   str(p)+“ - a_”+ str(a)+“ - i_”+ str(i)+“。xml”,“w”)       ^ IndentationError:意外缩进

箭头指向-a_所以它不能是缩进错误,因为它位于右边的中间位置?

所以我清理我的项目,复制到另一个目录,重新制作然后重新运行脚本。现在循环正常运行(控制台输出和文件已创建)但可执行文件似乎没有运行(文件为空)并且在每次循环迭代中我仍然收到错误:

  

/ bin / sh:1:无法打开random.Random:没有这样的文件

摩 如果我按照上面提到的那样再次发表评论,我会得到! :

  

错误:选项'--seed'的参数('eed')无效

这是c ++可执行文件的明显内存泄漏(缓冲区/堆栈溢出)吗?

1 个答案:

答案 0 :(得分: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

用于标识阅读pep8

你也可能希望以这种方式连接字符串,它看起来更干净。至少那是我喜欢的:

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