【问题标题】:Organizing multiple Python applications and shared library packages组织多个 Python 应用程序和共享库包
【发布时间】:2010-07-07 03:53:02
【问题描述】:

假设我正在为我的雇主编写两个应用程序,我们将它们称为 App1App2。这些应用程序依赖于一些包含两者所需代码的包。假设 App1 依赖于 PackageAPackageBApp2 依赖于 PackageBPackageC。对我来说似乎很自然的组织策略是将所有内容都检查到版本控制中,如下所示:

repo_root
+--- App1
|    +--- App1.py
|    +--- ... and so on
+--- App2
|    +--- ... files for App2
+--- PackageA
|    +--- __init__.py
|    +--- ... and more files
+--- PackageB
|    +--- ... files for PackageB
+--- PackageC
     +--- ... files for PackageC

问题在于导入包。比如App1App2都需要导入PackageB,但是我不能只把“import PackageB”放到主文件中这些应用程序。 Python 不会在父目录中搜索要导入的包。

我知道有几个选项可以做到这一点,但它们看起来都有点难看。我之前使用的一种策略是将 App1App2 的主文件放入“repo_root”目录。然后这两个主要文件可以毫无问题地导入包。另一种选择是使用 sys.path.append 和 file 找出父目录是什么,并将其添加到 Python 搜索模块的路径中。

有没有一种干净、优雅的方式来做这样的事情?感谢您的帮助。

更新:虽然 virtualenv 解决方案在处理包和依赖项方面可以提供很大帮助,但对于可以通过相对导入解决的问题来说,这似乎有点过头了。然而,执行相对导入似乎异常复杂。有PEP 366,但这很复杂,可能无论如何都不允许在包之外导入。我花了一些时间查看importlib,但我很确定这也不允许在包之外导入。许多人似乎使用 sys.path 的 munging,其中this 似乎是我找到的最好的例子。但是,正如我所提到的,这似乎是一种相当老套的做事方式。我几乎整天都在调查这个问题,我认为没有答案。如果我错了,请纠正我,但我现在相信,在不引入像 virtualenv 和一些 .pth 文件这样的重量级人物的情况下,没有干净、非黑客的方式来进行相对导入。无论如何,再次感谢您的帮助。我会将其标记为已回答,因为 virtualenv 是唯一的选择。

【问题讨论】:

    标签: python packages


    【解决方案1】:

    您可以为此使用的一种解决方案是为您的每个应用程序设置一个virtualenv,然后使用一个相对的.pth 文件指向包。这使您可以很好地控制每个应用程序的开发环境,并避免“但我的机器上有 package_x!”测试中的问题。

    【讨论】:

    • 我一直在阅读和观看一些截屏视频,我想我明白了。我可以为 App1 和 App2 创建一个 virtualenv 引导脚本,它将安装所需的开源库以及“.pth”文件(必须放在“站点包”类的文件夹中)。结帐后,运行引导程序将创建允许应用程序运行的环境。对于部署,我可以使用相同的引导程序来设置生产服务器吗?这是正确的吗?
    • 差不多。在 virtualenv 中开发的最大好处是确切地知道部署要求是什么,并且在 virtualenv 中部署绝对是一个需要考虑的选项。
    【解决方案2】:

    virtualenv 是处理此类问题的一种简洁优雅的方式。阅读入门,然后阅读pypi 上的摘要,然后安装并试一试!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多