Команда Bash может выполняться в оболочке, но не через python suprocess.run - PullRequest
1 голос
/ 25 июня 2019

Если я запускаю эту команду в оболочке Ubuntu:

debconf-set-selections <<< 'postfix postfix/mailname string server.exmaple.com'

Она выполняется успешно, но если я запускаю ее через python:

>>> from subprocess import run
>>> run("debconf-set-selections <<< 'postfix postfix/mailname string server.exmaple.com'", shell=True)
/bin/sh: 1: Syntax error: redirection unexpected
CompletedProcess(args="debconf-set-selections <<< 'postfix postfix/mailname string server.exmaple.com'", returncode=2)

Я не понимаю, почему Pythonпытаться интерпретировать, существует ли перенаправление и т. д. Как заставить команду успешно работать, чтобы можно было выполнить сценарий установки приложения, например, postfix в данном случае через python (не обычный скрипт bash)?

Я пыталсяразличные формы с двойными и одинарными кавычками (как рекомендуется в других сообщениях), но безуспешно.

1 Ответ

1 голос
/ 25 июня 2019

subprocess использует /bin/sh в качестве оболочки, и, вероятно, ваша система не поддерживает здесь-строку (<<<), следовательно, ошибка.

От subprocess источник:

if shell:
    # On Android the default shell is at '/system/bin/sh'.
    unix_shell = ('/system/bin/sh' if
                  hasattr(sys, 'getandroidapilevel') else '/bin/sh')

Вы можете запустить команду в качестве аргумента для любой оболочки, которая поддерживает здесь строку, например bash:

run('bash -c "debconf-set-selections <<< \"postfix postfix/mailname string server.exmaple.com\""', shell=True)

Будьте осторожны с цитированием.

Или лучше вы можетеостанься POSIX и используй echo и трубу для прохода через STDIN:

run("echo 'postfix postfix/mailname string server.exmaple.com' | debconf-set-selections", shell=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...