При использовании «pip» для установки пакетов в редактируемом режиме (с использованием флага «-e») любые исполняемые сценарии будут вызывать раздражающие сообщения «ResourceWarning: unclosed file» при вызове.
Чтобы воспроизвести, рассмотритеследующий минимальный пакет:
foo/
bin/foo.py
setup.py
, где "setup.py" имеет:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from setuptools import setup
setup(
name='foo',
version='0.1',
scripts=["bin/foo.py"],
zip_safe=False)
, а "bin / foo.py" имеет, например,
#! /usr/bin/env python
# -*- coding: utf-8 -*-
print("hello, world")
Затем при запуске:
python3 -m pip install -e foo
вызов исполняемого файла приводит к:
$ foo.py
/.../bin/foo.py:6: ResourceWarning: unclosed file <_io.TextIOWrapper name='/.../foo/bin/foo.py' mode='r' encoding='UTF-8'>
hello, world
Проблема заключается в фиктивной заглушке скрипта, которая автоматически генерируется и устанавливается в двоичном каталоге пользователя с помощью«pip» в редактируемом режиме вызывает исходный скрипт, используя следующую инструкцию:
exec(compile(open(__file__).read(), __file__, 'exec'))
Файл действительно открывается без закрытия.Это легко исправить вручную.Но как мы можем заставить «pip» делать это самостоятельно?
(Обратите внимание, что эта проблема не возникает, если не используется «редактируемый» режим, поскольку здесь исполняемый скрипт копируется напрямую, а не вызываетсяпо сценарию обертки).