0

背景

我正在写一本关于在 python 中做事的 html 书。它包含大量散布在输出中的文本和代码。我希望能够随时修改我的 python 代码,并拥有一个脚本来批量更新所有的 HTML 文件。

由于我将拥有大量的 html 文件和大量的 python 片段,因此每次更改某些内容时,我都无法手动将 python 复制并粘贴到 HTML 中。那将是一场噩梦。

编辑:

所以我有两个免费的文件:一个包含逻辑的 python 文件和一个 HTML 文件,它是那个 python 代码的教程。我希望能够随意编辑我的 python 文件,并标记它们,以便我的 HTML 文件也可以更新。

目前,当我更新我的 python 代码时,我只运行一个单独的 python 脚本,在两个文件中查找匹配的标签,并将其标签之间的 python 代码复制到其匹配标签之间的 HTML。我在整个文件中有很多这样的标签。我也有很多这样的文件对。

标签是 ^tagname 并以 ^/tagname 结尾

但是,这仅适用于代码本身,而不适用于代码的输出。我还希望能够(如果需要)将带标签的 python 的输出复制到 html 中,并让它出现在稍微修改的标签中。

我在考虑输出 &tagname 和 &/tagname。

结束编辑

但是从 python 文件中获取输出来做同样的事情被证明是相当困难的。


我的python代码是:(testCode.py)

#%%
# ^test
x=1
print(x)
# ^/test


#%%
print("this output I don't care about")

#%%
# ^test2
y=2
print(y)
# ^/test2

所以, test 和 test2 标签是我想要拆分代码的方式。


我的 html 看起来像这样:

<p> Some text explaining the purpose of the python code in test1 </p>
<!--^test-->

<!--^/test-->



<p> some more text explaining about test2</p>
<!--^test2-->

<!--^/test2-->

python 文件中 test1 标记之间的代码在上面的注释之间被复制。测试 2 也是如此。


这是迄今为止我在实际 html 文档中的截图。它看起来很棒,但缺少输出。

在此处输入图像描述


问题是我无法根据代码中注释内的标签来拆分输出。我需要使用这些标签将输出拆分为与每个标签关联的卡盘。


期望的输出

我想要的输出是一个字符串,如下所示:

# ^test
1
# ^/test

this is output I don't care about

# ^test2
2
# ^/test2

试图

我已经成功地将文件的输出捕获到一个字符串中,使用:

python_file = 'testCode.py'
process_result = subprocess.run(['python', './' + python_file], capture_output=True, universal_newlines=True)
output = str(process_result.stdout)

但显然这只是打印:

1
this is output I don't care about
2

我正在使用子进程,因为这个函数最终将在一个循环中被调用,其中包含一个 python 文件列表来更新输出。


我完全无法访问适当的标签并将它们穿插其中。

也许我正在接近这个错误。

4

1 回答 1

0

注意:此解决方案有效,但很混乱。

任何改进建议将不胜感激!

根据@flakes 评论,我想出了一个可行的解决方案,但这并不理想。我很肯定有更好,更优雅的方式来做到这一点。

我决定稍微降低自动化程度,以减少所需的代码和复杂性。

对于每篇文章,我现在都有一个文件夹,其中包含

  • 文章名称.py
  • 文章名称.html
  • ArticleName_helper.py
  • 输出文件 [文件夹]

在 ArticleName.py 中,我标记了代码。如果我想将代码的输出保存在标签内,我还要创建一个OutputTag对象(如下所述)。

#%%
out = OutputTag('test', __file__)
# ^test
x=1
print(x)
print("test")
# ^/test
out.done()

OuputTag对象和要替换的对象sdtout(存储在不同的文件夹中)

import os
import sys


#%%
class CustomStdout(object):
    def __init__(self, *files):
        self.files = files

    def write(self, obj):
        for f in self.files:
            f.write(obj)
            f.flush()  # If you want the output to be visible immediately

    def flush(self) :
        for f in self.files:
            f.flush()


#%%
class OutputTag:
    def __init__(self, tag, origin_file):
        origin_dir = os.path.dirname(origin_file)

        if not os.path.exists(origin_dir) :
            raise FileNotFoundError("Origin file does not exist!")

        dir = origin_dir + "/OutputFiles"
        if not os.path.exists(dir):
            os.makedirs(dir)

        file_name = os.path.join(dir, tag + '.txt')
        self.original = sys.stdout
        self.f = open(file_name, 'w')
        # This will go to stdout and the file out.txt
        sys.stdout = CustomStdout(sys.stdout, self.f)

    def done(self):
        self.f.close();
        sys.stdout = self.original

好的,这样就会用一堆以标签命名的 .txt 文件填充 OutputFiles 文件夹。

然后我运行 ArticleName_helper.py 脚本。

  1. 它引用了 py 和 html 文件。
  2. 帮助程序脚本在 ArticleName.html 中查找代码标签。
  3. 它在 ArticleName.py 中搜索匹配的标签,并在它们之间复制任何代码。
  4. 然后,此复制的代码将替换 HTML 中标记之间的任何现有文本。
  5. 类似地,它在 html 中搜索输出标签(&Tag 而不是 ^Tag)。
  6. 它在 OutputFolder 中查找与标记名称匹配的文件。
  7. 然后加载里面的文本,替换输出标签之间的 html 文件中的任何文本。

在我的 IDE 中,我有自动代码完成功能。在 python 中,当我键入 html 并按 tab 时,它会自动生成以下内容,其中包含准备好覆盖所有 3 个位置的 TAG 的多光标:

out = OutputTag('TAG', __file__)
# ^TAG

# ^/TAG
out.done()

同样在 html 编辑中,当我键入 py 并点击选项卡时,它会自动完成以下内容:

<pre><code class="language-python">
    <!--^TAG-->

    <!--^/TAG-->
</code></pre>

还有一个类似的输出,将 ^ 替换为 &

所以目前的工作流程是:

  1. 编写python文件
  2. 如果需要,添加标签
  3. 编写 HTML 教程,在输入和相关输出需要的地方添加注释标签。
  4. 运行 Python 文件以更新输出
  5. 运行帮助脚本
  6. HTML 文件会自动填充添加标签的代码和输出。

进行编辑后,只需执行步骤 4-6。

结果!

结果截图

于 2020-02-25T06:02:54.967 回答