对于那些好奇我为什么这样做的人:我需要一个tar球中的特定文件 - 不多也不少。我必须为make check
编写单元测试,但由于我被限制为“没有”文件,我必须在make check
内编写支票。这样,我必须写bash(但我不想)。
我不喜欢使用bash进行单元测试(对所有喜欢bash的人都很抱歉。我只是不喜欢它,我宁愿选择一种非常hacky的方法而不是编写多行bash代码),所以我写了一条python文件。后来我才知道由于一些未知的严格规则,我必须使用bash。我认为有一种方法可以将python文件的整个内容缓存到bash文件中的单个字符串中,因此我可以在bash中获取字符串文字并写入python文件然后执行它。
我尝试了以下尝试(在下面的脚本和结果中,我使用了另一个不是unit_test.py的python文件,所以不要担心它实际上看起来不像单元测试):
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脚本中吗?
答案 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()'