【问题标题】:Using Makefile bash to save the contents of a python file使用 Makefile bash 保存 python 文件的内容
【发布时间】:2025-12-25 05:20:08
【问题描述】:

对于那些对我为什么这样做感到好奇的人:我需要 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 文件了。

生成的文件看起来完全像{在此处插入巨型字符串}。我在尝试中做错了什么?还有其他更简单的方法可以让我将 python 文件作为字符串文字保存在 bash 脚本中吗?

【问题讨论】:

  • 看来你想做的任何事情都可能不是最好的方法......
  • 您说得对,先生!因此,我正在询问我必须“使用 bash”但实际上不使用 bash 的其他简单方法。
  • 为什么要“使用 bash”?
  • 在帖子中回答 - 必须做一些 makefile 的东西。
  • 但是严格的规范说 Makefile 必须存在。它必须是一个makefile。我不能在 tar 球中有物理 python 文件。我的 python 脚本中确实有运行 bash 的子进程模块,但我想这不是重点。接口是他们会调用make check

标签: python bash shell makefile


【解决方案1】:

最简单的方法是在你的 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()'

【讨论】:

  • 我想他也想在某个地方{some_custom_stuff} ... +1 虽然
  • 嗯 - 有趣。感谢您的建议!我现在就试试。编辑:我不认为我能做到这一点。我正在使用一个处理选项卡式逐行执行的生成文件。我认为可能有一种方法可以用“/”之类的东西连接这两行。
  • 是的 - 尝试执行 makefile 时遇到了一些麻烦。它说这个错误消息:Makefile:2: *** missing separator. Stop. 由于它不能接受多行参数。
  • 哦,我没有注意到它在生成文件中。这可能会有所帮助:*.com/questions/10121182/…
  • 经过 40 分钟的努力,我终于做到了。谢谢你,先生!作为未来的说明:您不能在不结束引号的情况下使用 \。因此,我无法直接调用python代码。我将字符串回显到一个文件中,然后从那里执行 python。它奏效了。