我正在写一本关于用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文档中的屏幕快照。看起来不错,但缺少输出。
问题是我无法根据代码中注释内的标记来分解输出。我需要使用这些标签将输出分成与每个标签相关的卡盘。
我想要的输出是如下所示的字符串:
# ^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文件来更新输出。
我完全迷住了,无法访问适当的标签并将它们穿插在其中。
也许我正在解决这个错误。
注意:此解决方案有效,但很麻烦。
基于@flakes的评论,我想出了一个可行的解决方案,但这并不理想。我很肯定有一种更好,更优雅的方法可以做到这一点。
我决定减少自动化程度,以减少所需的代码和复杂性。
对于每篇文章,我现在都有一个包含的文件夹
在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脚本。
在我的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>
和一个类似的输出,用^替换为&
进行编辑后,只需执行步骤4-6。