3

我正在尝试使用.add_font(). 自从我重写了我正在编写的代码以来,我曾经将所有脚本都放在一个名为“david”的文件夹中。现在我将它迁移到父目录中。

这是意外的行为:在我调用的函数中

# returns /home/path_to_dir/fonts/DejaVuSans.ttf (as expected)
print(os.path.join(os.getcwd(), "fonts", "DejaVuSans.ttf"))
pdf.add_font(
    "DejaVu",
    "",
    # returns /home/path_to_dir/david/../fonts/DejaVuSans.ttf (old path)
    os.path.join(os.getcwd(), "fonts", "DejaVuSans.ttf"),
    uni=True,
)

我删除了所有pycache文件,如果我添加一个名为“david”的空目录,一切都会再次运行,因为可以解析后一个路径。

可重现的最小示例: - 让 fpdf 工作: - pip install fpdf - 包含字体的字体目录(ttf 格式)

包含此代码的文件

import fpdf
import os


def reproducable_example():
    text = ['This is some test text', 'This is some more test text']
    pdf = fpdf.FPDF()
    print(os.path.join(os.getcwd(), '../fonts', 'DejaVuSans.ttf'))
    pdf.add_font(
        "DejaVu",
        "",
        os.path.join(os.getcwd(), "../fonts", "DejaVuSans.ttf"),
        uni=True,
    )
    pdf.set_font('DejaVu', "", 12)
    pdf.add_page()
    for string in text:
        pdf.multi_cell(0, 10, txt=string)
    pdf.output(os.path.join(os.getcwd(), 'text.pdf'))


reproducable_example()

如果第二次调用 os.getcwd() 会包含一个名为“david”的文件夹,那显然会很奇怪。因此,您可能必须先将代码放在名为“david”的嵌套文件夹中,然后运行它,然后将其放入父文件夹,删除“david”目录并再次运行它。

我还创建了一个 .workspace 文件夹,其中有我的 launch.json 文件。在此文件中,由于使用 vscode 调试器时的导入问题,我将密钥从cwd更改为。当我将文件迁移到父目录时,我把它改回来了。${workspaceRoot}${workspaceRoot}/david

这就是您可以在子文件夹中运行 os.getcwd() 然后手动退出的原因

在我的整个工作区中,我没有声明错误的文件路径,但.add_font()即使我将正确的路径硬编码到其中,该方法仍然会使用它

解决方案:当我运行脚本时,会自动创建一个 .pkl 文件。更改脚本目录时需要删除此文件,否则它将使用存储的路径

4

0 回答 0