Как использовать для цикла в команде Subprocess.run - PullRequest
1 голос
/ 14 мая 2019

Я использую subprocess.run для запуска команды, в которой есть цикл for, но не возвращается ожидаемый результат. Вот упрощенный случай, который показывает проблему. В оболочке bash:

for i in {1..3}; do echo ${i}; done

Результат:

1
2
3

Что я и ожидаю. Однако в моем коде, когда я выполняю это следующее:

subprocess.run("for i in {1..3}; do echo ${i}; done", shell=True, check=True)

результат напечатан на моей оболочке {1..3}

Но я хочу, чтобы результат был:

1
2
3

как при выполнении кода в моей оболочке. Буду признателен за любые идеи, как это исправить, спасибо!

Ответы [ 3 ]

1 голос
/ 14 мая 2019

Я бы порекомендовал использовать subprocess.popen:

from subprocess import popen
process = subprocess.Popen("bash for i in {1..3}; do echo ${i}; done")
try:
    outs, errs = process.communicate(timeout=15)
except TimeoutExpired as e:
    process.kill()
    outs, errs = process.communicate()

Или, используя исходную строку кода:

subprocess.run("bash for i in {1..3}; do echo ${i}; done", shell=True, check=True, capture_output=True)

Мне удалось получить эту информацию из документов подпроцесса, расположенных здесь: Подпроцесс Pypi Docs

С уважением, и я надеюсь, что это поможет.

0 голосов
/ 14 мая 2019

В случае python3:

import subprocess
result = subprocess.getoutput("""for i in {1..3}; do echo ${i}; done""")
print(result)
0 голосов
/ 14 мая 2019

Вы бы хотели порождать подоболочку:

subprocess.run("sh -c 'for i in {1..3}; do echo ${i}; done'", shell=True, check=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...