为什么 setuptools 不复制我的文件而 distutils 复制我的文件?

Why setuptools does not copy my files while distutils does?

我不太了解 setuptools 的行为。

我有一个小包,里面有一些动态生成的静态文件,使用内部 Flask 框架,用于一个简单的临时 Web 服务器。一切都在当地运作良好。我已经设法获得 setup.py 脚本来处理重载构建命令并添加几行。现在,当我使用:python setup.py 安装或构建时,一切正常。我的静态文件被复制到 virtualenv 中的正确目录:env/lib/python3.4/site-packages/mypackage,还生成了文件 MyPackage-0.0.1-py3.4.egg-info,一切正常.

但现在我意识到 need/want 具有 'install_requires'、'setup_requires'、'test_requires' 的功能,需要替换我的 从 disutils.core 导入设置 到 从 setuptools 导入设置 那时一切都停止了。 setuptools 不是处理我的静态文件,而是构建包含所有内容的大型二进制 egg 文件。 setup.py stdout 告诉我我的文件实际上在里面,滚动 vim 中的二进制文件也让我相信我的文件在里面。但我的脚本或 Flask 核心都无法读取它们。具有给定正确(我认为)路径的打开函数抛出指向 env/lib/python3.4/site-packages/MyPackage-0.0.1-py3.4.egg/mypackage/static/file.txt 的 NotADirectoryError。我知道提供这样的路径应该会自动解压 egg 文件并给我内容。我可以理解我缺乏经验,但 Flask 核心试图做完全相同的事情,但在同一点完全失败。所以问题是我做错了什么?当我切换回 distutils.core 时,一切又都正常了。

我知道这就是 setuptools 的工作方式,但无法访问我的静态文件并不是我想要的。我可以为我的代码编写解决方法,并即时解压缩文件,但我不认为这是正确的方法。此外,我可能无法为每个使用我的静态文件的外部包(例如 Flask here)编写解决方法。

如果有任何建议、链接或提示,我将不胜感激。我试图阅读 distutils 和 setuptools 源文件并找到一些配置选项,但我不希望最终用户被迫以非标准方式安装我的包。我想要实现的是键入 'python setup.py install' 并将所有内容隐藏在我的包中。

您有两个选择:

  1. 使用 zip_safe=False 关键字参数将您的包裹标记为非压缩包
  2. 使用setuptools pkg_resources API访问资源。