繁体   English   中英

如何将 package 之外的文件附加到我的 Python package

[英]How can I attach a file outside the package to my Python package

我有一个显示项目的 ABOUT.md 文件的 web 应用程序。 该项目具有以下文件树:

project_folder/
  main_package/
    assets/icon.png
    __init__.py
    app.py
  .gitignore # And other files
  README.md
  ABOUT.md
  setup.cfg
  setup.py

在 app.py 中,我有一个网络服务器,它呈现并提供文件README.md的内容。 它有这样的代码:

from main_package import __file__ as mpfile

# First parent is just the folder where __init__.py is located.
ABOUT_MD = Path(mpfile).parent.parent / 'ABOUT.md'

这无需构建即可工作,但是如果我构建轮子并将其安装在其他环境中,它将停止工作。

我修改了setup.cfg中的配置,因此它包含 ABOUT.md

[options.package_data]
main_package = 
  ../ABOUT.md
  assets/*

但这会将文件复制到site_packages的根目录,我认为这有点脏。

我想在根文件夹中保留ABOUT.md文件,因此它仍然可以通过 GitHub 访问,但我也希望能够构建和发布我的 package。

主意:

修改构建系统以在创建轮子时将 ABOUT.md 从根目录复制到main_package/assets/ABOUT.md 然后,在app.py中添加一个 if 来根据文件的位置加载正确的文件。 问题是我不知道如何让构建系统将文件复制到这个路径。

2022-07-18 更新:为什么不链接?

回应@Leander

如果我们使用硬链接,则该信息不会通过版本控制系统 (git) 传播,因此在每台其他计算机上它似乎是两个不同的文件,我们将不得不以某种方式同步数据(使用钩子或任何类型系统),加上它会占用双倍的磁盘空间。

如果我们使用符号链接,使用的空间会减少,但是存储库的 web 视图不能跟随符号链接,因此 ABOUT.md 结束不可用(它只显示符号链接的明文路径)。

符号链接

以相反的方式进行符号链接(原始在./ABOUT.md中并在main_package/assets/ABOUT.md创建符号链接到../../ABOUT.md完美无缺。

  • 确实,GitHub(例如)不遵循符号链接,但根文件夹中的 ABOUT.md 仍然可读。
  • Wheel 打包复制文件,而不是符号链接,因此可以在任何计算机上打包和安装应用程序。
  • 导入文件时无需添加 If 或 try/catch,只需main_package/assets/ABOUT.md

您的问题与存储库的版本控制问题非常相似。 通常,该版本由 git 存储库作为标记提供,并且可能从提交 hash 和未提交的脏标志中获取后缀。 https://github.com/jbweston/miniver为这个问题提供了一个非常轻量级的解决方案,所以我建议你遵循这个想法。 它基本上检查文件中的版本字符串,如果找到占位符,则使用 git 组成版本字符串,否则使用给定值。 此值仅在构建过程中设置,这意味着它在执行setup.py时被覆盖,因此仅出现在已安装的软件实例中。

在您的情况下,只需在构建过程中将版本替换为ABOUT.md内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM