我有一个名为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.txt的输出中提到了pip uninstall,但是pip并未自动将其删除。

所以我的问题是:
  • 为什么有和没有__init__.py之间有区别
  • 是否有任何方法可以像我的示例中那样使pip自动删除folder\file.txt
  • 最佳答案

    __init__.py文件告诉python它所在的目录是一个模块,并查看其中的所有子模块。这使pip认为它是一个模块,因此提及了其中的所有内容。

    从文档中:



    对于第二个问题,我的答案也许是。我之所以这样说,是因为我无法确定这是可能的。

    附言:我不确定(因为我没有测试过),但是也许您可以将file.txt的扩展名更改为.py,也许是在愚弄 pip 将其删除。

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

    10-11 22:23
    查看更多