使用“ 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'))
该文件确实是打开而没有关闭。手动修复很简单。但是,我们如何才能获得“点子”来正确地完成它呢?
(请注意,当不使用“可编辑”模式时,不会发生此问题,因为这里直接复制可执行脚本,而不是由包装脚本调用)。
答案 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版本中修复该模板。似乎这里唯一需要的是让某人足够关心以实际抱怨它。