Расширения оболочки не выполняются при запуске команды с `subprocess.call 'с` shell = True' - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь собрать некоторые файлы, используя python, но он выполняется неправильно.

Я пытался собрать некоторые файлы в Linux. Когда я использую команду "make ./package/feeds/proj/{clean,compile} V=s" в терминале, она работает правильно, но когда я пытаюсь запустить ее с помощью скрипта Python, используя команду "p = subprocess.call(r'/usr/bin/make package/feeds/proj/{clean,compile} V=s',shell = True))", она ведет себя по-другому.

Журналы:

при запуске в терминале:

make[1]: Entering directory '/local/mnt/workspace/rubaeshk/unused2/qsdk'
make[2]: Entering directory '/local/mnt/workspace/rubaeshk/unused2/qsdk/package/feeds/whc/qca-whc-crash-log'
rm -f /local/mnt/workspace/rubaeshk/unused2/qsdk/bin/ipq/packages/whc/qca-whc-crash-log_*
..(log continued until successfully built)

при запуске через скрипт Python:

WARNING: your configuration is out of sync. Please run make menuconfig, oldconfig or defconfig!
make[1]: Entering directory '/local/mnt/workspace/rubaeshk/unused2/qsdk'
make[1]: *** No rule to make target 'package/feeds/whc/qca-whc-crash-log/{clean,compile}'.  Stop.
make[1]: Leaving directory '/local/mnt/workspace/rubaeshk/unused2/qsdk'
/local/mnt/workspace/rubaeshk/unused2/qsdk/include/toplevel.mk:186: recipe for target 'package/feeds/whc/qca-whc-crash-log/{clean,compile}' failed
make: *** [package/feeds/whc/qca-whc-crash-log/{clean,compile}] Error 2

Может кто-нибудь увидеть, где это пошло не так ..

Ответы [ 2 ]

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

Как объяснено в subprocess.Popen документации (subprocess.call делегирует Popen, как и все другие вспомогательные функции), subprocess.call('command', shell=True) в Unix эквивалентно выполнению argv :

['/bin/sh', '-c', 'command']

И sh не поддерживает расширение скобок (это официальное имя для синтаксиса {a,b}).

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

p = subprocess.call('command', shell=True, executable='/bin/bash')

Пример:

$ python -c 'import subprocess; subprocess.call("echo /usr/{lib,bin}", shell=True, executable="/bin/bash")'
/usr/lib /usr/bin

Обратите внимание, однако, что использование shell=True не рекомендуется, потому что это по сути платформа-конкретный, зависит от локальной оболочки и ее настроек и может быть ошибкой или уязвимостью безопасности, если вы используете ненадежный ввод.Лучше составьте командную строку вручную и передайте полученный argv.

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

Расширение скобки не является частью стандартной оболочки;это дополнительная функция, предоставляемая некоторыми оболочками (например, bash) в дополнение к POSIX.Когда вы запускаете subprocess.call в Python, он, вероятно, использует /bin/sh, а не /bin/bash.

Итак, запишите это: package/feeds/whc/qca-whc-crash-log/clean package/feeds/whc/qca-whc-crash-log/compile

...