捕获子进程的输出,但是带有产生它的代码的标签

问题描述 投票:0回答:1

背景

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

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

编辑:

因此,我有两个免费文件:一个包含逻辑的python文件,一个HTML文件,该文件是该python代码的教程。我希望能够随意编辑我的python文件,并对其进行标记,以便也可以更新我的HTML文件。

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

标签是^标签名,以^ /标签名结尾

但是,这仅适用于代码本身,不适用于代码的输出。我还希望能够(如果需要)将标记的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文档中的屏幕快照。看起来不错,但缺少输出。

enter image description here


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


所需的输出

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

# ^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文件来更新输出。


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

也许我正在解决这个错误。

python parsing console subprocess
1个回答
0
投票

注意:此解决方案有效,但很麻烦。

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

基于@flakes的评论,我想出了一个可行的解决方案,但这并不理想。我很肯定有一种更好,更优雅的方法可以做到这一点。

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

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

  • ArticleName.py
  • ArticleName.html
  • ArticleName_helper.py
  • OutputFiles [文件夹]

在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并点击tab时,它会自动完成以下内容:

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

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

和一个类似的输出,用^替换为&

所以当前的工作流程是:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.