gpt4 book ai didi

python - 安装工具 : How to make sure file generated by packed code be deleted by pip

转载 作者:太空狗 更新时间:2023-10-29 20:29:47 26 4
gpt4 key购买 nike

我有一个名为 main.py 的简单代码,它在其中生成一个文件夹和一个文件:

import os
def main():
path = os.path.join(os.path.dirname(__file__), 'folder')

if not os.path.isdir(path):
os.mkdir(path)

with open(os.path.join(path, 'file.txt'), 'w+') as f:
f.write('something')


if __name__ == '__main__':
main()

如果这个脚本在文件夹中运行,那么结构应该是这样的:

.
├── main.py
└── folder
└── file.txt

我使用 setup.py 文件来打包代码,我在其中分配了一个名为 foo 的入口 pip 。 setup.py 看起来像:

from setuptools import setup  
setup(
name='mypack',
entry_points={
'console_scripts': ['foo=mypack.main:main'],
},
packages=['mypack'],
package_data={'': '*.txt'},
include_package_data=True
)

我用下面的结构打包了代码:

.
├── mypack
│ └── main.py
└── setup.py

我通过 pip install . 在根目录中安装它。然后我运行 foo,它确实生成了一个文件夹和一个文件。然后我通过 pip uninstall mypack 卸载它,终端中的输出显示:

Uninstalling mypack-0.0.0:
Would remove:
d:\programdata\envs\testsetup\lib\site-packages\mypack-0.0.0-py3.6.egg-info
d:\programdata\envs\testsetup\lib\site-packages\mypack\main.py
d:\programdata\envs\testsetup\scripts\foo-script.py
d:\programdata\envs\testsetup\scripts\foo.exe
Proceed (y/n)? y
Successfully uninstalled mypack-0.0.0

folder\file.txt 没有被 pip uninstall 删除,它的输出也没有提到任何关于 folder\file.txt 的信息


然后我用下面的结构打包代码:

.
├── mypack
│ ├── __init__.py
│ └── main.py
└── setup.py

__init__.py 是一个空文件。我做了同样的程序,即:pip install . -> foo -> pip uninstall mypack,然后终端中的输出是:

Uninstalling mypack-0.0.0:
Would remove:
d:\programdata\envs\testsetup\lib\site-packages\mypack-0.0.0-py3.6.egg-info
d:\programdata\envs\testsetup\lib\site-packages\mypack\*
d:\programdata\envs\testsetup\scripts\foo-script.py
d:\programdata\envs\testsetup\scripts\foo.exe
Would not remove (might be manually added):
d:\programdata\envs\testsetup\lib\site-packages\mypack\folder\file.txt
Proceed (y/n)? y
Successfully uninstalled mypack-0.0.0

这一次,folder\file.txtpip uninstall 的输出中被提及,但没有被 pip 自动删除。


所以我的问题:

  • 为什么有和没有__init__.py有区别
  • 有什么方法可以让pip像我的例子那样自动删除folder\file.txt吗?

最佳答案

pip/blob/master/src/pip/_internal/req/req_uninstall.py 的第 381 行:

if not verbose:
will_remove, will_skip = compress_for_output_listing(self.paths)
else:
# In verbose mode, display all the files that are going to be
# deleted.
will_remove = list(self.paths)
will_skip = set()

_display('Would remove:', will_remove)
_display('Would not remove (might be manually added):', will_skip)
_display('Would not remove (outside of prefix):', self._refuse)

您可以看到 compress_for_output_listing 将要删除的文件与要保留的文件分开,除非 verboseTrue,它似乎将它们全部删除.不过,这令人不快,因为 verbose 似乎是一个内部函数参数,并且没有命令行参数来设置它,并且需要更改源代码才能删除所有文件。

关于python - 安装工具 : How to make sure file generated by packed code be deleted by pip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50960604/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com