在集群上使用 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。
非常具体,但也许有一天有人会遇到同样的问题...
我使用 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。
非常具体,但也许有一天有人会遇到同样的问题...