- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
作为构建自定义 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/
我是一名优秀的程序员,十分优秀!