setuptools:包数据文件夹位置

2023-12-03

我使用 setuptools 来分发我的 python 包。现在我需要分发额外的数据文件。

根据我从 setuptools 文档中收集的信息,我需要将数据文件放在包目录中。但是,我宁愿将数据文件放在根目录的子目录中。

我想避免的:

/ #root
|- src/
|  |- mypackage/
|  |  |- data/
|  |  |  |- resource1
|  |  |  |- [...]
|  |  |- __init__.py
|  |  |- [...]
|- setup.py

我想要的是:

/ #root
|- data/
|  |- resource1
|  |- [...]
|- src/
|  |- mypackage/
|  |  |- __init__.py
|  |  |- [...]
|- setup.py

如果不是必需的话,我只是对拥有这么多子目录感到不舒服。我找不到原因,为什么我 /have/ 将文件放在包目录中。恕我直言,使用如此多的嵌套子目录也很麻烦。或者有什么充分的理由可以证明这种限制是合理的吗?


选项 1:作为包数据安装

将数据文件放置在 Python 包的根目录中的主要优点 是它可以让您不必担心文件将存放在用户的何处 系统,可能是 Windows、Mac、Linux、某些移动平台或 Egg 内。你可以 总能找到目录data相对于你的 Python 包根目录,无论它安装在哪里或如何安装。

例如,如果我有一个像这样的项目布局:

project/
    foo/
        __init__.py
        data/
            resource1/
                foo.txt

您可以添加一个功能__init__.py定位数据的绝对路径 文件:

import os

_ROOT = os.path.abspath(os.path.dirname(__file__))
def get_data(path):
    return os.path.join(_ROOT, 'data', path)

print get_data('resource1/foo.txt')

Outputs:

/Users/pat/project/foo/data/resource1/foo.txt

项目安装为 Egg 后路径为data会改变,但代码不需要改变:

/Users/pat/virtenv/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.egg/foo/data/resource1/foo.txt

选项 2:安装到固定位置

另一种方法是将数据放在 Python 包之外,然后 任何一个:

  1. 有位置data通过配置文件传入, 命令行参数或
  2. 将位置嵌入到您的 Python 代码中。

如果您计划分发您的项目,那么这是不太理想的。如果你really想要执行此操作,您可以安装data通过传入元组列表指定每组文件的目标位置,在目标系统上的任何位置:

from setuptools import setup
setup(
    ...
    data_files=[
        ('/var/data1', ['data/foo.txt']),
        ('/var/data2', ['data/bar.txt'])
        ]
    )

Updated:递归 grep Python 文件的 shell 函数示例:

atlas% function grep_py { find . -name '*.py' -exec grep -Hn $* {} \; }
atlas% grep_py ": \["
./setup.py:9:    package_data={'foo': ['data/resource1/foo.txt']}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

setuptools:包数据文件夹位置 的相关文章

  • 避免由于相对 URL 导致的错误请求

    我正在尝试使用Scrapy抓取一个网站 并且我想要抓取的每个页面的url都是使用这种相对路径编写的 a href en item to scrap html Link a 现在 在我的浏览器中 这些链接可以工作 您可以访问类似的网址http
  • 翠儿。让流永远运行

    我对 tweepy python 库比较陌生 我想确保我的流 python 脚本始终在远程服务器上运行 因此 如果有人能够分享如何实现这一目标的最佳实践 那就太好了 现在我正在这样做 if name main while True try
  • 将tensorflow 2.0 BatchDataset转换为numpy数组

    我有这个代码 train images test images tf keras datasets mnist load data train dataset tf data Dataset from tensor slices train
  • 在 Python 中使用 Selenium 处理“接受 Cookie”弹出窗口

    我一直在尝试用硒抓取这个房地产网站的一些信息 但是 当我访问该网站时 我需要接受 cookie 才能继续 这仅在机器人访问网站时发生 而不是在我手动执行时发生 当我尝试通过 xpath 或 id 查找相应的元素时 正如我在手动检查页面时找到
  • 如何在Python中循环并存储自变量中的值

    我对 python 很陌生 所以这听起来可能很愚蠢 我进行了搜索 但没有找到解决方案 我在 python 中有一个名为 ExcRng 的函数 我可以对该函数执行什么样的 for 循环 以便将值存储在独立变量中 我不想将它们存储在列表中 而是
  • PIL Image.size 返回相反的宽度/高度

    使用PIL确定图像的宽度和高度 在特定图像上 幸运的是只有这一个 但这很麻烦 从 image size 返回的宽度 高度是相反的 图片 http storage googleapis com cookila 533ebf752b9d1f7c
  • 如何从 Dockerfile 安装 Python 3.7 和 Pip

    我正在尝试构建基于 Ubuntu 18 04 的自定义 Docker 映像 Ubuntu 预装了 Python 3 6 但我想 1 安装 Python 3 7 2 将其设置为默认 Python 版本 这样就可以使用python代替pytho
  • 定义函数后对其进行修饰?

    I think答案是否定的 但我似乎找不到明确的说法 我有以下情况 def decorated function function functools wraps function def my function print Hello s
  • 如何使用 python urllib 在 HTTP/1.1 中保持活力

    现在我正在这样做 Python3 urllib url someurl headers HOST somehost Connection keep alive Accept Encoding gzip deflate opener urll
  • 无法打开 Python。错误 0xc000007b

    我最近一直在学习 Python 3 我在我的上网本 32 位 Windows 7 上创建简单的小程序没有任何问题 当我将它安装在我的上网本上时 我没有遇到任何问题 但现在我已经开始使用它了 我想将它安装在我的台式机上 并且我有一个 我的桌面
  • 如何通过双击在浏览器中打开 ipynb 文件

    以前 我安装了 Canopy 当时 我只需双击 ipynb 文件并在浏览器中打开它们即可 但是 后来我需要Anaconda 一旦我安装了它 这个功能就没有了 现在我只希望能够简单地双击 ipynb 文件 然后该文件就会在 Firefox 中
  • 如何在python中检索aws批处理参数值?

    流程 Dynamo DB gt Lambda gt 批处理 如果将角色 arn 插入动态数据库 它是从 lambda 事件中检索的 然后使用submit job角色 arn 的 API 被传递为 parameters role arn ar
  • 更改 pandas 中多个日期时间列的时区信息

    有没有一种简单的方法可以将数据帧中的所有时间戳列转换为本地 任何时区 不是逐列进行吗 您可以有选择地将转换应用于所有日期时间列 首先 选择它们select dtypes https pandas pydata org pandas docs
  • Python 中的 @staticmethod 与 @classmethod

    方法和方法有什么区别装饰的 https peps python org pep 0318 with staticmethod http docs python org library functions html staticmethod和
  • 如何在Python和Selenium中通过标签名称或id获取元素[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 和 Selenium 获取输入 但它向我显示错误 我该如何解决这个错误 inputElement send keys getStock getStocklFunc 0 Error i
  • 如何有效地从 loadmat 函数生成的嵌套 numpy 数组中提取值?

    python中是否有更有效的方法从嵌套的python列表中提取数据 例如A array array 12000000 dtype object 我一直在使用A 0 0 0 0 当你有很多像 A 这样的数据时 这似乎不是一个有效的方法 我也用
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • Airflow Python 单元测试?

    我想为我们的 DAG 添加一些单元测试 但找不到任何单元测试 有 DAG 单元测试框架吗 有一个端到端的测试框架存在 但我猜它已经死了 https issues apache org jira browse AIRFLOW 79 https
  • 张量流:注册 numpy bfloat16 扩展

    正如我所见 tensorflow 中有 bfloat16 的 numpy 扩展 https github com tensorflow tensorflow blob 24ffe9f729160a095a5cab8f592392018280
  • 全局变量是 None 而不是实例 - Python

    我正在处理Python 中的全局变量 代码应该可以正常工作 但是有一个问题 我必须使用全局变量作为类的实例Back 当我运行应用程序时 它说 back is None 这应该不是真的 因为第二行setup 功能 back Back Back

随机推荐

  • 松开按键后立即停止角色

    我正在尝试制作一个简单的角色控制器 void Update var x Input GetAxis Horizontal Time deltaTime 6 var z Input GetAxis Vertical Time deltaTim
  • 查找 prolog 程序给出错误结果的查询

    此 Prolog 程序将第三个参数定义为前两个数字参数的最大值 max X Y X X gt Y max X Y Y 我认为这个程序运行得很好 但我被告知它可能会给出错误的结果 你能说出什么时候以及为什么吗 这是教科书上的例子 max 5
  • 为什么这个 MakeFile 规则有两个冒号?

    EXEX main OBJS pp o gcc FLAGS o 我只是想理解上面的内容 据我了解 EXEX 中的所有内容都是使用以下模式构建的目标 main OBJS 和 pp o 是 EXEX 中事物的先决条件 第二行将使用 gcc 编译
  • 在 R Datatable 闪亮应用程序中单击按钮时,模态仅打开一次

    我有一个表 其中保存了书签 URL 截至目前 当您单击按钮时 它会打开模式 但是 一旦您有了第二条记录并单击该按钮 它就不会打开模式 此外 当模式打开时 它有一个 href 我怎样才能清理它并只显示 URL library shiny li
  • 为什么在 Java 中,推荐 ("string").equals(var) 而不是 (var).equals("string")?

    我见过大多数情况开发人员使用第一个字符串 然后使用该变量 equal手术 是什么原因 因为 var 可以是nullvar equals string 将抛出 NullPointerException 尝试在 null 上调用方法 另一方面
  • 带复选框的 Android ListView:如何捕获选中的项目?

    我必须做一个ListView with CheckBoxes然后当用户按下按钮时显示选中和未选中的项目 问题是我不知道该怎么做 我设法显示ListView与CheckBox用这个代码 package guestCheckBox com im
  • 启用选项 strict 时,Linq 查询对 DataGridViewRow 存在隐式转换错误

    我有一个 DataGridView 绑定到一个名为 BaseChange 的对象列表 BaseChange 对象由 4 个属性组成 更改类型 更改状态 变更说明 上次更改日期 datagridview 具有所有 4 个值以及第 5 个值的列
  • Adobe Air 4.0 原生扩展与 Google Play 服务

    这些天 我正在尝试将 AdMob 集成到我基于 Adob e Air 的 Android 应用程序中 谷歌播放服务 准备好 ane 文件后 在 Flash builder 4 6 中调试应用程序后出现以下错误 打包应用程序时发生错误 dx
  • 在 R 中获得多种分区方法的共识

    My data data cbind c 1 1 2 1 1 3 c 1 1 2 1 1 1 c 2 2 1 2 1 2 colnames data paste item 1 3 rownames data paste method 1 6
  • 插入后mysql返回索引

    我的方法是设置一个运行良好的插入命令 它将条目添加到我的数据库中 因为我想使用从第一次插入中获得的唯一索引在其他表中插入其他条目 我执行查询获取索引 然后重用它其他插入 虽然这很好用 我相信一定有更好的方法 有什么建议么 谢谢 对于自动增量
  • 灵活的锁定替代方案(选择性锁定)

    我需要解决具有不同内存位置的相同对象的情况 由于多线程 它发生在 REST 请求中 因此 作为解决方案的一部分 我实施了服务 我在这里分享最重要的部分 private Map
  • AngularJS错误.success不是一个函数

    我已经构建了一个工厂来处理控制器的函数 但不知何故控制器在其中一个函数上返回错误 错误 Auth getUser success 不是函数 http localhost 8080 app controllers mainCtrl js 10
  • 消失的对象 - Three.js CanvasRenderer

    我很困惑 我不明白为什么我的对象会随着画布渲染器消失 虽然它与 webGL 渲染器完全按照预期工作 但我需要在移动设备上显示它 因此无法访问 webGL 渲染器 我尝试过 overdraw true 但这似乎并没有使丢失的对象消失 http
  • 动画切换按钮

    我已经创建了动画切换 如果android checked true 即 它可以从 1 9 播放 但是如果android checked false 它卡在了drawable 10 但应该从10 20开始播放 从那时起它就完美了 但是当应用程
  • Swift 通用数组“不相同”错误

    我只是在浏览一些 Swift 的内容 这些内容在 Beta3 中显然已经过时了 func exchange
  • EF4.2 额外左外连接到同一个表

    我知道已经有一些关于此的问题 大多数与已解决的旧问题或多个表有关 我看到的任何其他 左外连接 问题都没有涵盖这个问题 我得到了INNER JOIN and LEFT OUTER JOIN在同一个查询中访问同一个表 表格概要 Users id
  • Android:捕获活动的返回

    我有一个关于开展新活动的问题 归根结底就是这样 我的视图上有 3 个选项卡 A contains gMap activity B camera activity C some random text fields 要求是应用程序以纵向模式运
  • 是否可以在 android gradle 中将 git 存储库声明为依赖项?

    我想使用 mavencentral 的库的主版本 是否可以在 android gradle 中将 git 存储库声明为依赖项 对我来说最好的方法是 https jitpack io 步骤 1 将 JitPack 存储库添加到存储库末尾的 b
  • OmniSharp.MSBuild.ProjectManager 无法在 Linux 上加载项目

    我正在我的 Manjaro Linux 笔记本上学习 C 我尝试安装 ms vscode csharp 扩展 但是在打开任何 NET Core 项目时 我收到以下错误消息 某些项目加载时遇到问题 请查看输出以了解更多信息 信息 我尝试设置
  • setuptools:包数据文件夹位置

    我使用 setuptools 来分发我的 python 包 现在我需要分发额外的数据文件 根据我从 setuptools 文档中收集的信息 我需要将数据文件放在包目录中 但是 我宁愿将数据文件放在根目录的子目录中 我想避免的 root sr