【问题标题】:Difference between using find_packages() vs "requirements.txt" for setup.py script使用 find_packages() 与 setup.py 脚本的“requirements.txt”之间的区别
【发布时间】:2018-05-28 00:04:18
【问题描述】:

我一直在打包一个 python 项目,以便我可以在实验室的其他系统上安装它。在我对如何创建 setup.py 脚本的研究中,我看到了两种方法。

1) 使用“pip freeze > requirements.txt”命令;然后设置脚本中的“packages='requirements.txt'”

2) 只需在设置脚本中使用“packages=find_packages()”

我的问题是,这两种方法有什么区别?似乎“find_packages”与“pip freeze”的作用相同,但在安装没有开始的模块方面没有任何作用。

谁能解释这两种方法的不同之处,或者只是解释每种方法的作用,以便我可以更明智地决定使用哪种方法?

谢谢!

【问题讨论】:

  • 仅供参考,我建议您咨询 packaging.python.org/tutorials/distributing-packages 了解所有 Python 打包研究。
  • “看起来“find_packages”和“pip freeze”是一样的”——是什么让你这么认为?他们做完全正交的事情。
  • 从我所读到的内容来看,我说它“似乎”是一样的,这就是为什么我认为我没有正确理解它的原因。我的理解是,“pip freeze”会为项目中使用的所有模块创建一个“图像”,并将它们放在以后可以在安装时使用的列表中。 “Find_packages”(再说一遍,我是怎么理解的)用“init”文件查找项目中的所有模块,然后......??这是我无法理解差异的地方; find_packages 找到这些包后如何处理它们?
  • pip freeze 列出了 pip 在当前环境中安装的所有 Python 项目(PyPI 上的东西)。 find_packages() 检查并描述您正在构建的项目的目录结构;它遍历当前目录查找包含__init__.py 文件的文件夹和子文件夹,并返回["package", "package.subpackage", "package.other_subpackage", "package.other_subpackage.subsubpackage", "etc"] 形式的列表。
  • 好的,那么它是否将包列表存储在某个地方,以便我安装项目的下一个系统知道项目需要哪些包并可以找到它们?还是我必须在项目中包含这些包,以便 find_packages 可以直接从目录中找到并安装它们?

标签: python pip setuptools python-packaging


【解决方案1】:

使用“pip freeze > requirements.txt”命令;然后在设置脚本中添加“packages='requirements.txt'”

即使假设 packages='requirements.txt' 你的意思是 packages=open('requirements.txt').read().splitlines(),这绝对是错误的做法,我希望你只是误读了你咨询过的任何来源,而不是实际发布的这种公然错误的信息某处。

packages 关键字到 setup() 函数的目的是告诉 setuptools 在分发和安装项目时要包含存储库中的 Python 代码目录。对于大多数简单的情况,您只需要packages=find_packages()

另一方面,requirements.txt 应该包含您的项目所依赖的其他人项目的列表(并且它应该是手工制作的,而不是像一只被切除了脑叶的黑猩猩那样将pip freeze 重定向到其中)。将其内容传递给的正确 setup() 关键字是 install_requires,这就是每当有人安装您的项目时,您的项目的依赖项也会被安装的原因。

【讨论】:

  • 好吧,我认为“脑叶黑猩猩”有点苛刻,但是……我明白你对需求文件的看法。但我仍然不明白 find packages 实际上在做什么。例如,我的项目使用了我下载并安装在我的 python 解释器的“site-packages”目录中的 5 个模块。我将“find_packages”放在我的 setup.py 中,然后将我的项目带到另一个系统进行安装。我运行 setup.py,它会找到 find_packages……然后会发生什么?它是否通过代码查找导入的模块?还是我必须以某种方式将模块包含在项目中?
  • 需求文件对我来说很有意义:“这里有一个安装需要的模块列表,找到并安装它们。”我只是不明白“find_packages”如何在没有模块的系统上安装模块,比如如果它是全新安装的 python 解释器,有哪些包可以找到?
  • @CashBest:我认为您可能对“包裹”在这种情况下的双重含义感到困惑。 “包”可能是指您从 PyPI 下载和安装的东西(PyPUG calls this a "distribution package";我一直称它为“项目”)或包含一个或多个 Python 文件的文件夹,这些文件可以使用 import folder_name 在 Python 中导入(PyPUG calls this an "import package")。 find_packages()packages 关键字处理第二种。
  • sigh 我现在觉得自己像个傻瓜;这只是不适合我。好的,例如:在我的开发系统上,我安装了 5 个非标准软件包。 setup.py 有 find_packages,它会找到这 5 个并“是的,你正在使用这些”。我去安装一个差异系统(使用新的 python 并且只安装了标准库)并运行 setup.py。它进入 find_packages,它有什么作用?新系统上的 find_packages 如何知道在另一个系统上找到了什么 find_packages?现在,我可以让我的项目在其他地方工作的唯一方法是手动安装我在新系统上使用的所有模块
  • @CashBest:您的项目的依赖项需要使用install_requires 参数声明为setup()。无论它们是在那里硬编码还是从requirements.txt 文件中读取,都取决于您。之后,任何使用pip 安装您的项目的人也将自动安装这些依赖项。
猜你喜欢
  • 2013-09-18
  • 2013-12-18
  • 2017-09-25
  • 2017-05-07
  • 2013-03-21
  • 2014-06-26
  • 2019-06-23
  • 1970-01-01
相关资源
最近更新 更多