覆盖已安装的源文件(不覆盖源目录中的原始文件)

2024-04-25 12:15:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将安装时最新提交的git哈希编码为库中函数的输出

我正在使用一个结构

.git/
setup.py
|- mylib/
|  - __init__.py
|  - git.py

其中git.py包含一个未配置的伪函数

def git():
    return None

在安装时,我希望覆盖git.py,以便它返回最新git提交的哈希值,例如:

def git():
    return "2d04d1a10f81d24183df7622c95398d60106dfff"

(其中散列是安装时git rev-parse HEAD的输出)

因此,我的问题是: 如何使用setuptools覆盖要安装的git.py,而不覆盖源目录中的文件


当前围绕setup.py的工作

import subprocess

git_hash = subprocess.check_output(["git", "rev-parse", "HEAD"]).strip().decode('UTF-8')

cmd = '''def git():
    return "{0:s}"
'''.format(git_hash)

os.rename('mylib/git.py', 'mylib/git.py.bak')

with open('mylib/git.py', 'w') as f:
    f.write(cmd)

setup(
    name = 'mylib',
    version = __version__,
    # ...
    packages = find_packages(),
)

os.rename('mylib/git.py.bak', 'mylib/git.py')

它可以临时更改源目录中的git.py。我宁愿把那个文件完全不动


1条回答
网友
1楼 · 发布于 2024-04-25 12:15:38

在setuptools的git存储库上的@webknjaz的帮助下(请参见issue),我找到了一个使用setuptools\u scm的解决方案,该解决方案有效:

文件结构

setup.py
|- mylib/
|  - __init__.py
|  - _version.py

setup.py

setup(
    name = 'mylib',
    packages = find_packages(),
    use_scm_version = {'write_to': 'mylib/_version.py'},
    setup_requires = ['setuptools_scm'],
)

init.py

from ._version import *

_version.py(虚拟,在安装时覆盖)

version = "None"
version_tuple = (0, 0, 0, "None", "None")

相关问题 更多 >