簡體   English   中英

通過從 HTCondor 作業運行的 python 腳本執行 bash 命令

[英]Executing a bash command through a python script run from an HTCondor job

我有一個 Python 腳本,它最后通過 subprocess.Popen subprocess.Popen()運行一個名為“quickFit”的可執行文件/程序。 當我啟動我的終端時,我總是移動到 quickFit 目錄和source setup.sh ,這樣我就可以從任何地方運行該可執行文件。 然后我嘗試在 HTCondor 作業中運行此腳本,但它出錯了。 我的 shell 是 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 命令運行並顯示選項列表和可能的 arguments(-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

管理員可以通過兩種方式配置 HTCondor 池——在提交機器和工作節點之間使用共享文件系統,或者不使用。 聽起來兩個節點之間沒有共享文件系統,因此您需要明確告訴 condor 使用 transfer_input_files 傳輸 quickFit 及其依賴的任何文件。

否則,如果存在共享文件系統,或者如果工作節點上預安裝了 quickFit,請嘗試使用 quickFit 的完整絕對路徑調用 popen。

來自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),這將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM