在集群上使用 qsub 提交作业时,使用 gitpython 获取当前哈希不起作用

Using gitpython to get current hash does not work when using qsub for job submission on a cluster

我使用 python 进行数据分析,最近我想到了将当前 git 散列保存在日志文件中的想法,这样我以后可以检查哪个代码版本创建了我的结果(以防我发现不一致或其他)。

只要我在本地就可以正常工作。

import git
import os
rep = git.Repo(os.getcwd(), search_parent_directories=True)
git_hash = rep.head.object.hexsha
with open ('logfile.txt', 'w+') as writer:
    writer.write('Code version: {}'.format(git_hash))

但是,我有很多繁重的计算,我 运行 在集群上使用 qsub 来加快速度(运行 并行分析主题),它看起来或多或少像这样:

qsub -l nodes=1:ppn=12 analysis.py -q shared

这总是会导致 git.exc.InvalidGitRepositoryError

编辑

打印 os.getcwd() 告诉我,在集群上,当前工作目录始终是我的 $HOME 目录,无论我从哪里提交作业。 我的下一个解决方案是使用建议的一些解决方案 here.

获取文件所在的目录

但是,这些解决方案会导致相同的错误,因为(这就是我的理解)我的文件以某种方式被复制到集群头节点 (/var/spool/torque/mom_priv/jobs) 根结构深处的目录中。

我当然可以写下我的文件的位置作为硬编码变量,但我想要一个适用于我所有脚本的通用解决方案。

所以在我向 IT 详细解释了我的问题后,他们可以帮助我解决问题。

显然 $PBS_O_WORKDIR 变量存储提交作业的目录。

所以我调整了对githash的访问权限如下:

try:
    script_file_directory = os.environ["PBS_O_WORKDIR"]
except KeyError:
    script_file_directory = os.getcwd()
    
try:
    rep = git.Repo(script_file_directory, search_parent_directories=True)
    git_hash = rep.head.object.hexsha
except git.InvalidGitRepositoryError:
    git_hash = 'not-found'
    
# create a log file, that saves some information about the run script
with open('logfile.txt'), 'w+') as writer:
    writer.write('Codeversion: {} \n'.format(git_hash))

我首先检查 PBS_O_WORKDIR 变量是否存在(因此如果我 运行 脚本作为群集上的作业)。如果它不使用当前工作目录,它确实从该目录获取 githash。

非常具体,但也许有一天有人会遇到同样的问题...