【问题标题】:Best practice for reusing python code [closed]重用python代码的最佳实践[关闭]
【发布时间】:2011-10-20 20:45:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: python dry pythonpath


    【解决方案1】:

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

    【讨论】:

    • 如果你不能/不想安装到你的机器全局安装中,我也会看看 virtualenv。 pypi.python.org/pypi/virtualenv
    • 我没有提到它,因为它在指南中有所描述,但你说得对,它是必不可少的,特别是如果你想在安装它的机器上继续开发你的库!跨度>
    • 确实,只要掌握了窍门,您就可以在几分钟内打包一个库。 Python 真的让这一切变得简单!
    • 如果我还想上传/下载/分享(谷歌应用引擎?)生成的包怎么办?
    • 我不熟悉 Google AppEngine,但我在回答中提到的指南解释了如何与 Python Package Index pypi 共享您的库。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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


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


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

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


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

      【讨论】:

        【解决方案4】:

        正如您自己所指出的,第一种方式很难接受,因为它有 countless well-known problems

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-25
          • 2021-11-10
          • 2015-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-29
          相关资源
          最近更新 更多