【问题标题】:Python Installing data files and then finding them againPython 安装数据文件,然后再次找到它们
【发布时间】:2017-12-14 01:48:21
【问题描述】:

我有一个针对需要将其语言环境文件安装到可访问位置的 linux 机器的 python 包。现在,我将它们安装到sys.prefix + "/share/locale/"

但是,我发现 Ubuntu 和 pip 的一个小警告。默认情况下,Ubuntu 将使用 pip 安装的软件包安装为/usr/local,并在安装过程中将sys.prefix 设置为该值。但是,安装后,运行包时,前缀是/usr,这意味着我的代码找不到安装在/usr/local 的语言环境文件。

我可以简单地对位置进行硬编码,但我不希望这样做,因为它会降低包的可移植性,并且需要用户以 root 身份安装它。这些在 setup.py 中添加为 data_files 并且不会作为 python 包被发现。

我怎样才能确保我的包在之后可以找到我的语言环境文件 安装?

我考虑在安装过程中在包的__init__.py 中添加一行,它创建了一个指向语言环境目录位置的变量。但是,在不更改源文件的情况下编辑正在安装的文件似乎并非易事。

这是一个仅限 python 3 的包。

【问题讨论】:

  • 你确定你没有两个 Python——在 /usr/local/bin 和 /usr/bin 中吗?我不相信 Python 会以这种方式改变 sys.prefix。但是 2 个不同的 Python 可能有 2 个不同的前缀。
  • @phd find `echo $PATH | tr ':' " " -name python3` 仅显示 /usr/bin/python3。我猜这是因为 Ubuntu 希望用户使用 pip 安装的文件转到 /usr/local 所以它更改了前缀,但随后需要将其更改回主机,

标签: python linux setuptools setup.py


【解决方案1】:

也许使用resource functions available in pkg_resources 来查找文件?

from pkg_resources import resource_stream, resource_filename
with resource_stream('my_package', 'locale/foo.dat') as infp:
    # ...
# ... or ...
foo_location = resource_filename('my_package', 'locale/foo.dat')

【讨论】:

  • 如果我不知道文件的路径,这对我有什么帮助?这些是数据文件,它们不会在一个包中。
  • 如果它们是你的包需要的数据文件,那么它们应该在你的包层次结构中。
  • 真的吗?语言环境文件应该放在 /usr/share/locale 下(至少在 debian 下)。我认为制作一个包裹是不合适的。我还在用 gettext 将 .po 编译为 .mo 文件,因此将其添加为包数据有点烦人,但我想可能。
  • 好吧,我以为我们在谈论通用 Python 包,而不是 Debian 包 :) 我不得不承认我对 Debian 打包了解不多。
  • 这是一个通用的 python 包,我也在 Debian 中打包。关键是, setup.py 应该能够安装到不同的目录。我猜我必须将它添加为包数据并将其保存在模块目录中。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
相关资源
最近更新 更多