Запуск команды оболочки модуля из модуля подпроцесса python - PullRequest
1 голос
/ 19 августа 2011

Я пытаюсь запустить vnc server, но для того, чтобы сделать это в первую очередь, мне нужно запустить 'module load vnc'.

Если я вызову which module в загруженной оболочке bash, то команда в not found - это PATH, но в то же время она доступна. Похоже, команда встроена.

Другими словами, похоже, мне нужно выполнить две команды одновременно module load vnc;vncserver :8080 -localhost, и я пишу скрипт, чтобы запустить его с python. Я пробовал разные варианты с subprocess.Popen как

subprocess.Popen('module load vnc;vncserver :8080 -localhost', shell=True) 

, который возвращает 127 код выхода или command not found.

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?

Ответы [ 3 ]

2 голосов
/ 19 августа 2011

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

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

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

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

0 голосов
/ 06 августа 2018

Вы можете вызвать module из скрипта Python.Команда module предоставляется программным обеспечением модулей среды, которое также предоставляет сценарий инициализации python.py.

Оценка этого сценария в сценарии Python включает функцию Python module.Если в /usr/share/Modules установлены модули среды, вы можете найти этот скрипт в /usr/share/Modules/init/python.py.

Следующий код включает module функцию python:

import os
exec(open('/usr/share/Modules/init/python.py').read())

После этого вы можете загрузитьмодуль и запустите ваше приложение:

module('load', 'vnc')
subprocess.Popen(['vncserver', ':8080', '-localhost'])
0 голосов
/ 19 августа 2011

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

subprocess.check_call('module load vnc'.split())
subprocess.Popen('vncserver :8080 -localhost'.split())
...