«source» для установки PATH в битовый режим с shell = True, не имеющего эффекта в Python - PullRequest
0 голосов
/ 07 мая 2018

Ниже приведен код в сценарии оболочки

source /proj/common/tools/repo/etc/profile.d/repo.sh
repo project init $branch
repo project sync
source poky/fnc-init-build-env build
bitbake -g $image

Я пытаюсь преобразовать сценарий оболочки в сценарий Python

a = subprocess.call("source /proj/common/tools/repo/etc/profile.d/repo.sh", shell=True)
b = subprocess.call("repo project init " + branch, shell=True)
b2 = subprocess.call("repo project sync", shell=True)
c = subprocess.call("source poky/fnc-init-build-env build", shell=True)
os.chdir("poky/build")
d = subprocess.call("bitbake -g " + image, shell=True)

Но я получаю следующую ошибку

/bin/sh: bitbake: command not found

Как решить эту проблему в python?

Ответы [ 4 ]

0 голосов
/ 07 мая 2018

При использовании 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 - они обычно должны быть в любой команде, в которой вы не явно намереваетесь игнорировать сбои.

0 голосов
/ 07 мая 2018

вы должны добавить битбэйк к пути:

set Path=%path%;PathOfBitbake

запустить его в командной строке Windows, затем повторить попытку

0 голосов
/ 07 мая 2018

Проблема в том, что вы запускаете subprocess.call(something, shell=True) несколько раз и предполагаете, что переменные, заданные в первом вызове, присутствуют в более поздних вызовах, которые используют оболочки независимо от предыдущих вызовов.

Я бы поместил команды в сценарий оболочки, а затем запустил его с помощью одной команды subprocess.call. Кажется, что нет смысла преобразовывать его построчно в python, просто запустив команды оболочки с модулем subprocess.

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

0 голосов
/ 07 мая 2018

Вам нужно добавить путь к 'bitbake', чтобы он был найден в вашем скрипте Python.

sys.path.append(your_path_there)
...