Как избежать сценариев, установленных Pip в редактируемом режиме, генерирующих сообщения «ResourceWarning: незакрытый файл»? - PullRequest
0 голосов
/ 25 июня 2018

При использовании «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» делать это самостоятельно?

(Обратите внимание, что эта проблема не возникает, если не используется «редактируемый» режим, поскольку здесь исполняемый скрипт копируется напрямую, а не вызываетсяпо сценарию обертки).

1 Ответ

0 голосов
/ 25 июня 2018

попробовать:

Вы найдете шаблон в каталоге site-packages с именем файла script (dev).tmpl:

$ cat ".venv/lib/python3.6/site-packages/setuptools/script (dev).tmpl"
# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r
__requires__ = %(spec)r
__import__('pkg_resources').require(%(spec)r)
__file__ = %(dev_path)r
exec(compile(open(__file__).read(), __file__, 'exec'))

Отредактируйте его так, как вы хотите, например:

# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r
__requires__ = %(spec)r
__import__('pkg_resources').require(%(spec)r)
__file__ = %(dev_path)r
try:
    f = open(__file__)
    exec(compile(f.read(), __file__, 'exec'))
finally:
    f.close()

наконец:

Голосование по запросу-запросу: https://github.com/pypa/setuptools/pull/1398 Это было объединено почти сразу, поэтому шаблон должен быть исправлен в следующем выпуске setuptools. Кажется, единственное, что здесь нужно, - это чтобы кто-то был достаточно внимателен, чтобы на самом деле жаловаться на это.

...