[英]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.