Запуск команды оболочки модуля из модуля подпроцесса python

1

Я пытаюсь запустить 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?

Как вы думаете?

Спасибо.

  • 1
    Нужно ли запускать module load vnc в той же оболочке / команде, что и vncserver ? Зачем вам нужен /bin/bash ? /bin/sh почти наверняка является символической ссылкой на /bin/bash .
  • 0
    Вам нужна оболочка для выполнения нескольких команд. Вы можете попробовать что-то вроде 'bash -c "module load vnc; vncserver :8080 -localhost"' но, вероятно, это не совсем правильный способ сделать это.
Показать ещё 15 комментариев
Теги:
subprocess

2 ответа

2
Лучший ответ

Модули окружения обычно просто изменяют для вас пару переменных окружения. Как правило, можно пропускать module load whatever шаг в целом и просто не зависеть от этих модулей. я рекомендую

subprocess.Popen(['/possibly/path/to/vncserver', ':8080', '-localhost'], 
                 env={'WHATEVER': 'you', 'MAY': 'need'})

вместо загрузки модуля.

Если вы настаиваете на использовании этого базового метода, то вы хотите начать баш самостоятельно с помощью Popen(['bash',...

  • 0
    спасибо Майк Я также думал напрямую запустить vncserver, но я не смог найти, где находится файл vncserver, и неизвестно, как расширяется среда после указания модуля vnc.
  • 0
    @yart, в этом случае Popen(["bash", "-c", "module load vnc; vncserver :8080 -localhost"]) или любой другой Popen(["bash", "-c", "module load vnc; vncserver :8080 -localhost"]) может быть вашим лучшим выбором.
Показать ещё 2 комментария
0

Если вы хотите сделать это с помощью shell=False, просто разделите это на два вызова Popen.

subprocess.check_call('module load vnc'.split())
subprocess.Popen('vncserver :8080 -localhost'.split())
  • 0
    module , скорее всего, встроенная оболочка модулей среды, а не исполняемый файл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню