Подпроцесс Python check_output FileNotFoundError: [Errno 2] Нет такого файла или каталога

Я написал небольшой скрипт на Python для сборки и тестирования образов докеров этого проекта. Скрипт хорошо работает локально, но дает сбой удаленно во время check_output.

build.py

    print(check_output(["which", "dgoss"]))
    result = str(check_output(["dgoss", "run", image_tag], cwd=image_path, stderr=subprocess.DEVNULL))

.gitlab-ci.yml

    before_script:
      - curl -fsSL https://goss.rocks/install | sh
      - ls -la /usr/local/bin/ | grep goss
    script:
      - which dgoss
      - python3 ./infrastructure/build.py

Выход

dgoss master has been installed to /usr/local/bin/dgoss
$ ls -la /usr/local/bin/ | grep goss
-rwxr-xr-x    1 root     root          3803 May 17 08:58 dgoss
-rwxr-xr-x    1 root     root       8524064 May 17 08:58 goss
$ which dgoss
/usr/local/bin/dgoss
$ python3 ./infrastructure/build.py
infrastructure/broker
b'/usr/local/bin/dgoss\n'
Traceback (most recent call last):
  File "./infrastructure/build.py", line 54, in <module>
    test()
  File "./infrastructure/build.py", line 42, in test
    result = str(check_output(["dgoss", "run", image_tag], cwd=image_path, stderr=subprocess.DEVNULL))
  File "/usr/lib/python3.6/subprocess.py", line 356, in check_output
    **kwargs).stdout
  File "/usr/lib/python3.6/subprocess.py", line 423, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'dgoss': 'dgoss'

Файл присутствует и является исполняемым. Почему python выдает исключение?

Что check_output делает? Он явно ищет имена файлов dgoss и не может найти, что это за файл?

olinox14 17.05.2019 11:30

Вы должны попытаться вызвать команду dgoss с полным путем. Вот так: result = str(check_output([str(check_output(["which", "dgoss"])).strip(), "run", image_tag],... Конечно, вы можете создать отдельную переменную для пути dgoss.

milanbalazs 17.05.2019 12:25

Пробовал полный путь, тоже не работает.

Matthias Brandt 17.05.2019 12:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
1 579
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, dgoss — это оболочка bash для goss, а образы alpine docker поставляются без bash.

before_script:
  - apk add curl python3 bash

Другие вопросы по теме