Выполнение команды bash с помощью сценария python, запущенного из задания HTCondor - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть сценарий Python, который в конце запускает исполняемый файл / программу с именем "quickFit" до subprocess.Popen(). Когда я запускаю свой терминал, я всегда перехожу в каталог 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 и настройку повторного поиска. sh, но это вызвало еще больше проблем.
Наконец, я попытался добавить getenv = True в файл .sub, что привело к следующей ошибке: quickFit: error while loading shared libraries: libquickFit.so: cannot open shared object file: No such file or directory

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Из документации Popen :

В POSIX с оболочкой = True, оболочкой по умолчанию является / bin / sh

и

Если shell = True, в POSIX исполняемый аргумент задает оболочку для замены по умолчанию / bin / sh

Так как ваша команда 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 и настройка источника. sh).

0 голосов
/ 14 апреля 2020

Администратор может настроить пул HTCondor двумя способами: либо с общей файловой системой между отправляющим компьютером и рабочими узлами, либо без нее. Похоже, что между двумя узлами нет общей файловой системы, поэтому вам нужно явно указать condor передать quickFit и любые файлы, от которых он зависит, с помощью Transfer_input_files.

В противном случае, если существует общая файловая система или если QuickFit предварительно установлен на рабочем узле, попробуйте вызвать popen с полным абсолютным путем к quickFit.

...