gpt4 book ai didi

python - setup.py, pip - 获取python包的原始执行路径

转载 作者:行者123 更新时间:2023-11-28 19:21:43 24 4
gpt4 key购买 nike

我有一个 python 包,我需要通过 pip 安装它作为我项目需求文件的一部分,但我需要将一些文件从我的包复制到安装这个包的项目。我正在考虑使用 setup() 中的 data_files 选项来做到这一 pip ,例如:

setup(
name='my_pacakge',
...
data_files=[
('example/folder1', ['something1/file1.ext', 'something1/file2.ext']),
('folder2', ['something2/file1.ext', 'something2/file2.ext']),
]
)

我希望将这些文件复制到相对于运行 pip install my_package 的目录的路径中,最好是我的项目根目录,留下如下树

project_root
├── example
│   └── folder1
│   ├── file1.ext
│   └── file2.ext
└── folder2
├── file1.ext
└── file2.ext

但为此我需要知道运行 pip install my_package 的绝对路径。我试过 inspect.stackinspect.currentframesys.get_frameinspect.inspect.getouterframes(some_of_these_frames) 但这仅在安装时提供有关 setup.py 当前位置的信息,即像这样的目录

/private/var/folders/gq/vpylvs0d51162jtyqhtgdc6m0000gn/T/pip-tNcbvb-build
/var/folders/gq/vpylvs0d51162jtyqhtgdc6m0000gn/T/pip-6a8MKS-build/setup.py

这对我来说一 pip 用处都没有。

现在,我知道 setuptools/setup.py 不应该这样使用,但我真的需要在可安装包中打包一些文件并复制/移动在安装时将它们添加到项目根目录。

关于如何实现这一 pip 有什么建议吗?

谢谢! :)

最佳答案

使用pkg_resources

此软件包随 setuptools 一起安装。

来自包文档字符串:

Docstring:
Package resource API
--------------------

A resource is a logical file contained within a package, or a logical
subdirectory thereof. The package resource API expects resource names
to have their path parts separated with ``/``, *not* whatever the local
path separator is. Do not use os.path operations to manipulate resource
names being passed into the API.

The package resource API is designed to work with normal filesystem packages,
.egg files, and unpacked .egg files. It can also work in a limited way with
.zip files and with custom PEP 302 loaders that support the ``get_data()``
method.

如果您使用 zip_safe = False 安装您的包,您的数据将在目录中可用。

使用 zip_safe = True 安装,它将成为 egg 的一部分。但是如果你需要使用那里的文件,这很容易,pkg_resources 提供了一组很好的函数和方法

  • pkg_resources.resource_exists
  • pkg_resources.resource_isdir
  • pkg_resources.resource_stream - 提供类文件对象
  • pkg_resources.resource_filename
  • pkg_resources.resource_listdir
  • pkg_resources.resource_string

请注意,这甚至适用于 zipsafe True 安装。

只需将您的数据放入与您的包目录相关的目录中。然后从您的代码中:

import pkg_resources
fname = pkg_resources.resource_filename("your.package.name", "folder/example1.txt")

仅用于静态文件

不要尝试在其中放置任何正在更改的文件。从技术上讲这是可能的(使用 zip_safe = False 文件就在那里),但这绝对是糟糕的设计(许可,包更新)。

不要从pip初始化你的项目,最好提供一些appinit命令

使用 pip 将数据安装到应用程序目录是真正的滥用。

我建议定义一个由我们的程序安装的命令,如 appinit,并在需要填充目录时使用它。 buildout(由 zc.buildout 安装)等命令经常使用这种模式。

关于python - setup.py, pip - 获取python包的原始执行路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23548595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com