【问题标题】:Executing a bash command through a python script run from an HTCondor job通过从 HTCondor 作业运行的 python 脚本执行 bash 命令
【发布时间】:2020-07-21 08:09:01
【问题描述】:

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

test.py:

#!/usr/bin/env python

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

test.sub:

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

【问题讨论】:

  • quickFit 不在您的 $PATH 中,因此请指定 quickFit 的完整路径或将 $HOME/private/scripts 添加到您的 $PATH 变量中
  • @Joshua:另外,错误信息说 /bin/sh: quickFit,这意味着你既没有通过 bash 也没有通过zsh.

标签: python zsh executable jobs condor


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    来自Popen documentation

    在 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),这将起作用。

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 2018-08-19
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多