33

我编写了一个 python 库应用程序(其中包含几个 *.py 文件)。而且我的几个python项目需要重用库应用程序中的代码。重用python代码的推荐最佳实践是什么?目前我已经想到了三个选项:

  1. 复制和粘贴。这与最佳实践相去甚远。它违反了 DRY 原则。(不要重复自己。)
  2. 将库应用程序的文件夹添加到环境变量 PYTHONPATH:export PYTHONPATH=/path/to/library/app中。然后同一台计算机上的每个项目都可以引用库应用程序中的代码。
  3. 并将库应用程序的文件夹放在 python 代码中的 sys.path 中:sys.path.append('/path/to/library/app')

在以上三个选项中,您更喜欢哪一个?与其他两种选择相比,它有什么优势?你还有其他更好的选择吗?非常感谢有多年python开发经验的人能回答这个问题。

4

4 回答 4

46

请允许我提出第四个替代方案:花时间学习如何打包您的库并将其安装在您的站点包中;这比人们想象的要容易,而且我相信这是值得的。这是一个很好的起点:https ://packaging.python.org/en/latest/

于 2011-08-05T13:13:10.307 回答
5

在您的三个选项中,PYTHONPATH 是要走的路。复制和粘贴显然已经失效,并且将代码添加到您的其他项目以修改 sys.path 只会污染那些了解其环境的文件。

第四种选择是,从您的通用代码创建一个真正的可安装包,并将其安装到您的 Python 安装中。然后,您可以像任何其他第 3 方安装代码一样简单地导入这些模块。

于 2011-08-05T13:13:24.853 回答
3

如果它是一个共享库,您应该将其打包并将其添加到站点包中,然后您不必担心设置任何内容。这是最好的选择。


如果您不想使用站点包,请使用 PYTHONPATH。这就是它存在的原因,它是做你想做的事的方式。


您可能想考虑使用site.addsitedir, path.append 不会防止重复。它还允许您利用 .pth 文件。

通过动态设置/添加东西到 PYTHONPATH 可以sys.path达到相同的结果,但是如果您选择重用新库,它会使事情变得复杂。如果您的路径发生变化,它也会导致问题,您必须更改代码与环境变量。除非完全有必要,否则不应动态设置 python 路径。


复制和粘贴不是重复使用模式。您没有重复使用任何您正在复制和增加维护的东西。

于 2011-08-05T13:06:40.903 回答
2

第一种方法,正如您自己指出的那样,很难接受,因为它有无数众所周知的问题

另外两个有自己的问题。对于初学者来说,当文件移动时,它们需要手动工作(如果将其与应用程序逻辑混合使用,例如将其放在 *.py 文件中而不是将其留给运行它的计算机,则尤其糟糕),并且需要固定安装位置(绝对路径) ) 或至少某个目录结构(相对路径)。恕我直言,这些方式只有在应用程序永远不会移动到其他任何地方时才可以接受。一旦需要,您应该放弃并使用现有解决方案作为不使用它的一个原因,对于小型和本地脚本来说太过分了,不再适用:

制作公用部分,您显然已经将其视为独立库(好!),它本身就是一个成熟的项目setup.py,允许使用单个命令以跨平台方式安装和添加到 PYTHONPATH . 您不需要在 PyPI 上实际发布它,但如果您将来改变主意,这样做会更容易。如果您这样做并在 PyPI 上发布您的一些项目,您还可以让每个潜在用户更轻松地安装有问题的项目及其依赖项。

于 2011-08-05T13:12:55.250 回答