Модуль подпроцесса в python утверждает, что «команда не найдена» для «списка модулей»? - PullRequest
0 голосов
/ 01 апреля 2019

В настоящее время я использую модуль подпроцесса в python для целей написания сценариев, и мне не удалось выполнить команду 'список модулей', несмотря на эту работу, когда я запускаю ее в оболочке, и несмотря на то, что любые другие виды команд работают нормально при использовании подпроцессамодуль для выполнения команд.

Два варианта, которые я пробовал:

p = subprocess.Popen('module list', shell=True)
print(p.communicate()[0])

и

p = Popen(["module", "list"], stdout=subprocess.PIPE)
print(p.communicate()[0])

Для таких команд, как 'echo hello world' и даже более длинных команд с несколькими аргументами, любой изэти форматы работают просто отлично.Отличается ли терминал, из которого я запускаю команды, от оболочки, используемой для выполнения команд с использованием подпроцесса?Я получаю следующую ошибку:

/bin/bash: line 1: module: command not found

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

В документации к программному обеспечению Environment Modules содержится рекомендация о том, как инициализировать команду module в Python (которая должна работать на Python 2 или 3):

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

После инициализации *Функция 1005 * доступна и может использоваться следующим образом:

module('sub-command', 'arg1', 'arg2', ...)

Например:

module('load', 'foo', 'bar')
module('list')
module('avail')
0 голосов
/ 03 апреля 2019

Исходя из того, что вы сказали в комментариях, я полагаю, что вы собираетесь использовать модули среды в Python неправильно: на самом деле в самих модулях есть метод для импорта функциональности module в Python, как объяснено здесь :

>>> execfile('/usr/local/Modules/default/init/python.py')
>>> module('list')
No Modulefiles Currently Loaded.
>>> module('load','foo')
>>> module('list')
Currently Loaded Modulefiles:
  1) foo/1.0

Конечно, не очень безопасно использовать execfile(), поэтому я немного предпочитаю метод импорта, описанный здесь (слегка изменен для Python 3поддержка):

import os

if 'PYTHONPATH' in os.environ:
    os.environ['PYTHONPATH'] +=':'+os.environ['MODULESHOME']+"/init"
else:
    os.environ['PYTHONPATH'] = os.environ['MODULESHOME']+"/init"

from python import module
...