使用Makefile bash保存python文件的内容

时间:2016-09-27 06:02:17

标签: python bash shell makefile

对于那些好奇我为什么这样做的人:我需要一个tar球中的特定文件 - 不多也不少。我必须为make check编写单元测试,但由于我被限制为“没有”文件,我必须在make check内编写支票。这样,我必须写bash(但我不想)。

我不喜欢使用bash进行单元测试(对所有喜欢bash的人都很抱歉。我只是不喜欢它,我宁愿选择一种非常hacky的方法而不是编写多行bash代码),所以我写了一条python文件。后来我才知道由于一些未知的严格规则,我必须使用bash。我认为有一种方法可以将python文件的整个内容缓存到bash文件中的单个字符串中,因此我可以在bash中获取字符串文字并写入python文件然后执行它。

我尝试了以下尝试(在下面的脚本和结果中,我使用了另一个不是unit_test.py的python文件,所以不要担心它实际上看起来不像单元测试):

toStr.py:

import re

with open("unit_test.py", 'r+') as f:
    s = f.read()

s = s.replace("\n", "\\n")
print(s)

然后我使用以下方法输出结果:

python toStr.py > temp.txt

看起来像是:

#!/usr/bin/env python\n\nimport os\nimport sys\n\n#create number of bytes as specified in the args:\nif len(sys.argv) != 3:\n print("We need a correct number of args : 2 [NUM_BYTES][FILE_NAME].")\n exit(1)\nn = -1\ntry:\n n = int(sys.argv[1])\nexcept:\n print("Error casting number : " + sys.argv[1])\n exit(1)\n\nrand_string = os.urandom(n)\n\nwith open(sys.argv[2], 'wb+') as f:\n f.write(rand_string)\n f.flush()\n f.close()\n\n

我尝试将其作为字符串文字并将其回显到一个新文件中,看看我是否可以将其作为python文件运行但它失败了。

echo '{insert that giant string above here}' > new_unit_test.py

我想把上面这个语句复制到我的“bash单元测试”文件中,这样我就可以在bash脚本中执行python文件了。

生成的文件看起来与{insert giant string here}完全相同。在我的尝试中我做错了什么?还有其他更简单的方法可以将bthon文件作为字符串文字保存在bash脚本中吗?

1 个答案:

答案 0 :(得分:2)

最简单的方法是在python代码中只使用双引号,然后在bash脚本中将所有python代码包装在一对单引号中,例如,

#!/bin/bash

python -c 'import os
import sys

#create number of bytes as specified in the args:
if len(sys.argv) != 3:
    print("We need a correct number of args : 2 [NUM_BYTES][FILE_NAME].")
    exit(1)

n = -1
try:
    n = int(sys.argv[1])
except:
    print("Error casting number : " + sys.argv[1])
    exit(1)

rand_string = os.urandom(n)

# i changed ""s to ''s below -webb
with open(sys.argv[2], "wb+") as f:
    f.write(rand_string)
    f.flush()
    f.close()'