Python subprocess.Popen () не работает команда - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь использовать subprocess.Popen() для запуска команды в моем скрипте. Код:

output = Popen(["hrun DAR_MeasLogDump " + log_file_name], stdout=subprocess.PIPE, stderr = subprocess.PIPE, executable="/bin/csh", cwd=cwdir, encoding='utf-8')

Когда я печатаю вывод, он выводит на печать созданный вывод оболочки, а не саму команду, которая есть в списке. Я пытался избавиться от executable='/bin/csh', но тогда Попен даже не побежал.

Я также пытался использовать subprocess.communicate(), но он тоже не работал. Я бы также получил вывод оболочки, а не сам факт выполнения команды.

Я хочу полностью избежать использования shell=True из-за проблем с безопасностью.

РЕДАКТИРОВАТЬ: Во многих различных попытках, "Хрун" не повторно признается. «hrun» - это вызываемый сценарий Pearl, DAR_MeasLogDump - это действие, а log_file_name - файл, для которого сценарий будет вызывать свое действие. Есть ли какая-либо настройка или конфигурация, которые необходимо выполнить, чтобы «hrun» был распознан?

Ответы [ 4 ]

0 голосов
/ 11 марта 2019

Это работает с cat пример:

import subprocess

log_file_name='-123.txt'

output = subprocess.Popen(['cat', 'DAR_MeasLogDump' + log_file_name], 
                                stdout=subprocess.PIPE, 
                                stderr=subprocess.STDOUT)
stdout, stderr = output.communicate()
print (stdout)
print (stderr)

Я думаю, вам нужно только изменить вашу команду ' hrun '

0 голосов
/ 11 марта 2019

Указание нечетной оболочки и явного cwd кажется здесь совершенно неуместным (при условии, что cwdir определено для текущего каталога).

Если первый аргумент subprocess является списком, no shell не задействован.

result = subprocess.run(["hrun", "DAR_MeasLogDump", log_file_name],
    stdout=subprocess.PIPE, stderr = subprocess.PIPE,
    universal_newlines=True, check=True)
output = result.stdout

Если вам нужно, чтобы он работал под устаревшей версией Python, возможно, используйте check_output вместо run.

Как правило, вы хотите избегать Popen, если вам не нужно делать что-то, чего не могут выполнять функции-обертки более высокого уровня.

0 голосов
/ 11 марта 2019

Вы создаете экземпляр subprocess.Popen, но не выполняете его.

Вы должны попробовать:

p = Popen(["hrun", "DAR_MeasLogDump ", log_file_name], stdout=subprocess.PIPE, stderr = subprocess.PIPE, cwd=cwdir, encoding='utf-8')

out, err = p.communicate()  # This will get you output

Аргументы должны передаваться как последовательность, если вы не используете shell=True, а затем использование executable не требуется .

Обратите внимание, что если вы не используете расширенные функции из Popen, документ рекомендует использовать subprocess.run:

from subprocess import run

p = run(["hrun", "DAR_MeasLogDump ", log_file_name], capture_output=True, cwd=cwdir, encoding='utf-8')

out, err = p.communicate()  # This will get you output
0 голосов
/ 11 марта 2019

Попробуйте:

output = Popen(["-c", "hrun DAR_MeasLogDump " +log_file_name], stdout=subprocess.PIPE, stderr = subprocess.PIPE, executable="/bin/csh", cwd=cwdir, encoding='utf-8')

csh ожидает -c "full command here". Без -c Я думаю, что он просто пытается открыть его в виде файла.

...