当前位置: 首页 > 面试题库 >

setuptools:包数据文件夹位置

万修然
2023-03-14
问题内容

我使用setuptools分发我的python包。现在,我需要分发其他数据文件。

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

我要避免的是:

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

我想拥有的是:

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

如果不是必须的,我只是对拥有这么多子目录感到不满意。我找不到原因,为什么我必须将文件放在包目录中。使用如此众多的嵌套子目录恕我直言也很麻烦。还是有什么充分的理由可以证明这一限制?


问题答案:

选项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')

输出:

/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代码中。

如果您打算分发您的项目,那么这是远远不够的。如果 确实
要执行此操作,则可以data通过传入元组列表来指定每组文件的目标位置,从而将其安装在目标系统上的任意位置:

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

更新 :递归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']}


 类似资料:
  • 问题内容: 使用setuptools时,无法让安装程序提取任何文件。我读过的所有内容都表明,以下是正确的方法。有人可以请教吗? 数据文件的位置在哪里。 问题答案: 我知道这是一个老问题,但人们发现这里通过谷歌自己的方式: 是低了下来,肮脏的谎言。它仅在构建 二进制 软件包()时使用, 而 在构建源软件包()时不使用。当然,这是荒谬的-人们希望构建源代码分发将导致文件的集合,这些文件可以发送给其他人

  • python3 setuptools 如何打包main.py 供其他 py项目调用? main依赖app里面的enit.py 和同级ss.py文件 这个setup.py如何写? 希望大佬帮忙解决!

  • 问题内容: 我正在尝试压缩包含子文件夹的文件夹。尝试压缩名为10-18-2010_4D的文件夹。以上程序以以下异常结束。请提供有关如何解决此问题的建议。 问题答案: 您需要检查文件是否为目录,因为您无法将目录传递给zip方法。 看一下该页面,该页面显示了如何递归压缩给定目录。

  • 问题 你的包中包含代码需要去读取的数据文件。你需要尽可能地用最便捷的方式来做这件事。 解决方案 假设你的包中的文件组织成如下: mypackage/ __init__.py somedata.dat spam.py 现在假设spam.py文件需要读取somedata.dat文件中的内容。你可以用以下代码来完成: # spam.py import pkgutil data =

  • 本文向大家介绍如何在Ubuntu 16.04上更改PostgreSQL数据文件夹位置,包括了如何在Ubuntu 16.04上更改PostgreSQL数据文件夹位置的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将学习如何将PostgreSQL数据库数据目录更改或重定位到Ubuntu 16.04上的新位置。由于我们需要更多空间,并且出于安全原因,我们将数据目录更改为另一个卷或其他位置,因此该

  • 问题内容: 我有一个具有固定布局的应用程序,无法更改。我想使用setuptools将其包装起来,例如编写一个脚本。 使用官方文档,我能够编写第一个模板。但是,有问题的应用程序使用了很多其他数据文件,这些文件不是任何程序包的明确组成部分。这是一个示例源树: 这是麻烦所在:中的代码 读取文件和。对于前者,我可以通过添加一个空文件将其升级到程序包并由拾取来修补该问题。但是我怎么可能增加我的呢? 所提出的