Python скрипты bin virtualenv всегда завершаются с кодом 1 - PullRequest
1 голос
/ 30 мая 2020

У меня есть virtualenv с некоторыми скриптами / приложениями, которые входят в комплект моего приложения.

Предположим, это выглядит примерно так:

ls /venv/bin/

activate
myscript
python
...

Когда я запускаю myscript с

/venv/bin/python /venv/bin/myscript

или

/venv/bin/myscript

, я правильно выполняю myscript; однако возвращенный статус выхода возвращается с 1, когда я знаю, что он успешен.

myscript копируется в /bin с помощью сценариев entry_point в setup.py:

entry_points={
        'console_scripts': [
        'myscript=myscript.__main__:main',
      ],
},

Я вижу, что скопированная фактическая версия myscript содержит дополнительный код, который может нарушить выход.

Есть ли правильный способ запуска существующих пакетов в /venv/bin, чтобы избежать неправильных кодов выхода?


Дополнительная информация:

Сам исполняемый файл выглядит так:

from myscript.__main__ import main
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

1 Ответ

1 голос
/ 01 июня 2020

Проблема возникла из-за кода myscript.py. В этом файле код завершается при достижении:

return "Something that the user would see"

Когда myscript.py запускается непосредственно с терминала, его код выхода равен 0.

Когда он вызывается в отдельном файле (в моем случае это сценарий-оболочка, упакованный как console_scripts), его код выхода равен 1. Код вызывается с помощью этой строки (где main соответствует myscript.py):

sys.exit(main())

Я считаю, это потому, что sys exit принимает любое возвращаемое значение, отличное от 0, как код выхода 1 (исключение).

Изменение моего кода в myscript.py на log вывод вместо возврата, исправлена ​​проблема с кодом выхода.

...