При использовании shell=True
первый элемент списка - это скрипт для запуска, и последующие аргументы передаются этому скрипту.
Каждый subprocess.Popen()
вызов запускает одну оболочку ; состояние, настроенное в одном, не передается другим, поэтому команда source
бесполезна, если только вы не выполните команды, которые зависят от него, в рамках одного и того же вызова .
script='''
branch=$1; shift # pop first argument off the list, assign to variable named branch
source /proj/common/tools/repo/etc/profile.d/repo.sh || exit
repo project init "$branch" || exit
repo project sync || exit
source poky/fnc-init-build-env build || exit
exec "$@" # use remaining arguments to form our command to run
'''
subprocess.call([
"bash", "-c", script, # start bash, explicitly: /bin/sh does not support "source"
"_", # becomes $0 inside the shell
branch, # becomes $1, which is assigned to branch and shifted off
"bitbake", "-g", image # these arguments become "$@" after the shift
])
Обратите внимание на || exit
s - они обычно должны быть в любой команде, в которой вы не явно намереваетесь игнорировать сбои.