如何避免Pip在可编辑模式下安装的脚本生成“ ResourceWarning:未关闭的文件”消息?

时间:2018-06-25 17:27:13

标签: python-3.x pip setuptools

使用“ pip”以可编辑模式(使用“ -e”)标志安装软件包时,任何可执行脚本在调用时都会产生令人讨厌的“ ResourceWarning:未关闭文件”消息。

要进行复制,请考虑以下最小包装:

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'))

该文件确实是打开而没有关闭。手动修复很简单。但是,我们如何才能获得“点子”来正确地完成它呢?

(请注意,当不使用“可编辑”模式时,不会发生此问题,因为这里直接复制可执行脚本,而不是由包装脚本调用)。

1 个答案:

答案 0 :(得分:1)

尝试:

您将在站点软件包目录中找到模板,文件名为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()

最终:

对pull-request进行投票:https://github.com/pypa/setuptools/pull/1398 这几乎立即合并了,因此应该在下一个setuptools版本中修复该模板。似乎这里唯一需要的是让某人足够关心以实际抱怨它。