gpt4 book ai didi

python - 安装.py : installing just a pth file?

转载 作者:太空狗 更新时间:2023-10-29 21:04:23 34 4
gpt4 key购买 nike

作为构建自定义 python 的最后一步,我需要添加一个 myproject.pth

目前我在 Makefile 中这样做:

install:
rm -f ../../lib/python2.6/site-packages/myproject.pth
cp myproject.pth ../../lib/python2.6/site-packages/myproject.pth

但我想将其封装在 setup.py 中。不幸的是 setup.py 文档似乎没有涵盖这个微不足道的案例!任何帮助表示赞赏。我试过这个但它不起作用:

from setuptools import setup
setup(
packages=['mypackage_pth'],
package_dir={'mypackage_pth': '.'},
package_data={'mypackage_pth': ['mypackage.pth']},
)

最佳答案

正确的做法是扩展 setuptools 的 build_py,并将 pth 文件复制到构建目录中,在 setuptools 准备所有文件的位置 site-packages 那里。

from setuptools.command.build_py import build_py


class build_py_with_pth_file(build_py):
"""Include the .pth file for this project, in the generated wheel."""

def run(self):
super().run()

destination_in_wheel = "mypackage.pth"
location_in_source_tree = "src/mypackage.pth"

outfile = os.path.join(self.build_lib, destination_in_wheel)
self.copy_file(location_in_source_tree, outfile, preserve_mode=0)

setup(
...,
cmdclass={"build_py": build_py_with_pth_file},
)

这里(在撰写本文时)的所有其他答案都在微妙的方面是错误的。

data_files=[(site_packages_path, ["mypackage.pth"])]

这在语义上是错误的——pth 文件不是数据。它是代码,就像项目其余部分中的各种 .py 文件是代码一样。更重要的是,这在功能上也被破坏了——以一种稍微微妙但重要的方式。

这会将 site_packages_path 嵌入到轮子中。您最终会得到一个包含如下文件路径的轮子:

my_package-1.0.0.data/data/lib/python3.9/site-packages/mypackage.pth

这个轮子只能在 Python 3.9 上工作(因为这就是路径)但它很容易标记为 py3(即与所有 Python 版本兼容)。

检测起来很重要,因为您需要一个开发工作流,使用生成的 wheel 跨多个不同 Python 版本运行测试。

shutil.copy('mypackage.pth', site_packages_path)

这……很糟糕。

虽然它可以跨 Python 版本工作,但即使用户使用 pip download mypackage 下载项目,这也会“安装”pth 文件。

更重要的是,为该项目生成的 wheel 不会有任何与该项目关联的 pth 文件。因此,后续安装将不会安装 pth 文件(因为 pip 将缓存本地构建的轮子)。

This can't be reproduced by installing from the source directory locally and is similarly non-trivial: 这检测起来很重要,因为你需要一个开发工作流程,将包安装在与当前环境不同的环境中你已经构建它,以一种他们可以检测到这一点的方式运行测试。

关于python - 安装.py : installing just a pth file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2145779/

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