我有一个名为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
的入口点。 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.txt
的输出中提到了pip uninstall
,但是pip
并没有自动将其删除。
我的问题:
__init__.py
和不使用pip
folder\file.txt
自动删除hive
? 答案 0 :(得分:1)
__init__.py
文件告诉python它所在的目录是一个模块,并查看其中的所有子模块。这使pip
认为它是一个模块,因此提到了其中的所有内容。
从文档中:
init .py文件是使Python将目录视为包含包的必需文件;这样做是为了防止具有通用名称的目录(例如字符串)无意间隐藏了以后在模块搜索路径上(更深层)出现的有效模块。在最简单的情况下, init .py只能是一个空文件
对于第二个问题,我的回答是也许。我之所以这样说,是因为,我无法完全确定这是可能的。
PS:我不确定(因为我尚未测试),但是也许您可以将file.txt
的扩展名更改为.py
,也许是在愚弄点子删除它。
答案 1 :(得分:1)
在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
从要保留的文件中分离出要删除的文件,除非verbose
是True
,似乎全部删除了它们。不过,这实在令人um目结舌,因为verbose
似乎是一个内部函数参数,并且没有命令行参数可以对其进行设置,因此需要更改其源代码才能删除所有文件。