Запустить системные команды Python на Solaris - PullRequest
0 голосов
/ 07 марта 2012

Я использую команды Python в среде Solaris. Я не могу выполнить subprocess.call для него, так как он дает мне ошибку в execute_child "[Errno 2] Нет такого файла или каталога". Я пробовал альтернативные способы, используя popen2 / 3/4, но выдает ошибку «DeprecationWarning: модуль popen2 устарел. Используйте модуль подпроцесса». Я не хочу использовать os.system из-за некоторых ограничений. Есть ли другой способ сделать эту работу? Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Вы пробовали subprocess.popen()?Это просто:

output, error = subprocess.popen(your_command, shell=True, 
                stdout=subprocess.PIPE, stderr=subprocess.PIPE);

Он заменяет popen2(), что на самом деле не рекомендуется:

os.popen2 (cmd [, mode [,bufsize]])

Устаревший с версии 2.6: эта функция устарела.Используйте модуль подпроцесса.Особенно внимательно изучите раздел «Замена старых функций с помощью модуля подпроцесса».

Что касается ошибки No such file or directory, попробуйте использовать абсолютный путь.

0 голосов
/ 07 марта 2012

Ниже приведен код из написанной мной программы на Python, которая управляет томами Solaris Volume Manager (SVM) в системах Solaris 10. Он использует тот же подход, описанный ранее, но добавляет в p.communicate (). Обратите внимание, что в этом случае вывод stderr перенаправляется на стандартный вывод, потому что в этом случае не было необходимости различать сообщения об ошибках и нормальный вывод.

# Constants
DATADIR="/etc/lvm"
METASTAT_CMD="/usr/sbin/metastat"
MD_CF = DATADIR + "/md.cf"

def check_svm_volume_exists():
    # Check to see if any SVM volume(s) exist or not. If none exist, exit.
    syscmd = " ".join([METASTAT_CMD, "-p", ">", MD_CF])
    p = subprocess.Popen(syscmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    out_data, err_data = p.communicate()

    if out_data == "":
        return out_data 
    else:
        print("No Solaris Volume Manager volume(s) appear to be configured. Exiting.")
        sys.exit(1)
...