1

我有一个 Python 脚本,它最后通过subprocess.Popen(). 当我启动终端时,我总是移动到 quickFit 目录,source setup.sh因此我可以从任何地方运行该可执行文件。然后我尝试在 HTCondor 作业中运行此脚本,但它出错了。我的外壳是 zsh。这是一个例子:

测试.py:

#!/usr/bin/env python

import subprocess
out = subprocess.check_output("quickFit -h", shell = True)
print(out)

测试子:

executable              = ~/private/scripts/TEST.py
universe                = vanilla
log                     = ~/private/scripts/TEST/log.txt
error                   = ~/private/scripts/TEST/err.txt

should_transfer_files   = IF_NEEDED
when_to_transfer_output = ON_EXIT

queue 1

运行test.py会产生预期的行为:quickFit 命令运行并显示选项列表和可能的参数(-h 用于帮助)。quickfit -h这与我从终端运行时的行为完全相同。
但是,运行condor_submit test.sub会导致作业提前结束,并且 err.txt 文件会通知我非零退出状态 127:/bin/sh: quickFit: command not found

我已经尝试chmod -R 777 *了 quickFit 目录中的所有内容,因为我认为它与权限有关,但没有奏效。
我也尝试过(在 python 中)将目录更改为 quickFit 目录并重新采购 setup.sh,但这带来了更多问题。
最后我尝试添加getenv = True.sub导致以下错误的文件:quickFit: error while loading shared libraries: libquickFit.so: cannot open shared object file: No such file or directory

4

2 回答 2

0

来自Popen 文档

在 shell=True的 POSIX 上,shell 默认为 /bin/sh

如果 shell=True,在 POSIX 上,可执行参数指定默认 /bin/sh 的替换 shell

因此,由于您的quickFit命令适用于zsh,请将 test.py 更改为:

#!/usr/bin/env python

import subprocess
out = subprocess.check_output("quickFit -h", shell = True, executable = '/path/to/zsh')
print(out)

并更改/path/to/zsh为任何结果which zsh,例如:

which zsh
# /usr/local/bin/zsh on my mac with Mojave
# /usr/bin/zsh on my Kubuntu VM

将调用zsh而不是sh在运行命令时调用。如果您遵循与通常相同的程序(移动到 quickFit 目录并获取 setup.sh),这将起作用。

于 2020-04-17T07:48:02.440 回答
0

管理员可以通过两种方式配置 HTCondor 池——在提交机器和工作节点之间使用共享文件系统,或者不使用。听起来两个节点之间没有共享文件系统,因此您需要明确告诉 condor 使用 transfer_input_files 传输 quickFit 及其依赖的任何文件。

否则,如果存在共享文件系统,或者如果工作节点上预安装了 quickFit,请尝试使用 quickFit 的完整绝对路径调用 popen。

于 2020-04-14T02:31:29.623 回答