Я пытаюсь запустить vnc-сервер, но для этого сначала мне нужно запустить 'load module vnc'. Если я вызываю, which module
в загруженной оболочке bash, то команда, которая не найдена, является PATH, но в то же время она доступна. Похоже, что команда встроена.
Другими словами, похоже, что мне нужно выполнить сразу две команды module load vnc;vncserver :8080 -localhost
и я пишу скрипт, чтобы запустить его с python. Я пробовал разные варианты с subprocess.Popen как
subprocess.Popen('module load vnc;vncserver :8080 -localhost', shell=True)
Я получаю 127 код выхода или команда не найдена.
subprocess.Popen('module load vnc;vncserver :8080 -localhost', shell=False)
показ
File <path>/subprocess.py line 621, in \__init__
errread, errwrite)
OSError: [Errno 2] No such file or directory.
если я укажу с shell = True, то он выполняется из /bin/sh
но мне нужно это из /bin/bash
. Указание executable='/bin/bash'
также не помогает. Он загружает новую оболочку bash, но начинается как строка, но не как процесс, т.е. я вижу в списке ps точно ту же команду, которую я хотел бы начать.
Не могли бы вы посоветовать, как начать эту команду из модуля подпроцесса? Возможно ли, чтобы это началось с shell = False?
Как вы думаете?
Спасибо.
Модули окружения обычно просто изменяют для вас пару переменных окружения. Как правило, можно пропускать module load whatever
шаг в целом и просто не зависеть от этих модулей. я рекомендую
subprocess.Popen(['/possibly/path/to/vncserver', ':8080', '-localhost'],
env={'WHATEVER': 'you', 'MAY': 'need'})
вместо загрузки модуля.
Если вы настаиваете на использовании этого базового метода, то вы хотите начать баш самостоятельно с помощью Popen(['bash',...
Popen(["bash", "-c", "module load vnc; vncserver :8080 -localhost"])
или любой другой Popen(["bash", "-c", "module load vnc; vncserver :8080 -localhost"])
может быть вашим лучшим выбором.
Если вы хотите сделать это с помощью shell=False
, просто разделите это на два вызова Popen
.
subprocess.check_call('module load vnc'.split())
subprocess.Popen('vncserver :8080 -localhost'.split())
module
, скорее всего, встроенная оболочка модулей среды, а не исполняемый файл.
module load vnc
в той же оболочке / команде, что иvncserver
? Зачем вам нужен/bin/bash
?/bin/sh
почти наверняка является символической ссылкой на/bin/bash
.'bash -c "module load vnc; vncserver :8080 -localhost"'
но, вероятно, это не совсем правильный способ сделать это.