FileNotFoundError: [Errno 2] Нет такого файла или каталога + os.execv - PullRequest
2 голосов
/ 20 июня 2019

Я создаю скрипт-обертку для выполнения моих программ на Python.Логика выглядит так:

  1. Я установлю все необходимые модули в док-контейнер
  2. Вытащите контейнер и запустите скрипт, чтобы любой мог запустить мои скрипты, не беспокоясь о зависимых модулях
  3. Я создал скрипт-обертку, который будет вызываться для выполнения желаемой программы.

Это мой скрипт-обёртка:

import os
import sys
import argparse

parse = argparse.ArgumentParser()
parse.add_argument('command', help="give datacenter name")
parse.add_argument('args', nargs=argparse.REMAINDER)
parse_arguments = parse.parse_args()

'''
Co-relate to the command and corresponding scripts to trigger
'''
scripts = {
    'verify' : '/path/verify.py'
    }

if __name__ == '__main__':

    if parse_arguments.command not in scripts:
        print('These are the available scripts to run:')
        print('\n'.join(sorted(scripts.keys())))
    else:
        os.execv(scripts.get(parse_arguments.command), 
[scripts.get(parse_arguments.command)] + parse_arguments.args) .   

Я запускаю это как,

$ docker run -it --rm --net host run-script verify --listenv tpc1
Traceback (most recent call last):
  File "/path/runme.py", line 28, in <module>
    os.execv(scripts.get(parse_arguments.command), 
[scripts.get(parse_arguments.command)] + parse_arguments.args)
FileNotFoundError: [Errno 2] No such file or directory

Мой образ Docker является run-script

Если я запускаю тот же код с локального компьютера, он работает.но внутри контейнера он показывает, что этот файл не находит ошибку.

Может кто-нибудь помочь мне в этом?

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Мне удалось решить эту проблему. Проблема была в основном с Шебангом, который я предоставил. Поэтому, когда я выполнял сценарий в контейнере Docker, он проверял выполнение кода из местоположения shebang.

Я бы сказал, что это ошибка с моей стороны, FileNotFoundError не дал мне подсказку к Шебангу. Наконец-то разобрался.

@ olinox14 - Спасибо за ваше обновление, параметр "prog" в argparse помог мне вывести лучшее справочное сообщение с именем скрипта в докер-контейнере, а не с полным путем внутри док-контейнера.

0 голосов
/ 20 июня 2019

Первый аргумент, переданный sys.argv - это путь к запущенному файлу, здесь /path/runme.py. Файл обнаруживается при запуске с локального компьютера, но, вероятно, не в контейнере Docker (я не уверен, почему).

Попытайтесь установить параметр prog при создании экземпляра вашего ArgParser, что-то вроде:

parse = argparse.ArgumentParser(prog="run_me.py")
...