python - 组织多个 Python 应用程序和共享库包

标签 python package

假设我正在为我的雇主写两份申请,我们称它们为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似乎是我发现的最好的例子。但是,正如我提到的,这似乎是一种相当老套的做事方式。我花了将近一整天的时间来调查这个问题,但我认为没有答案。如果我错了请纠正我,但我现在相信没有一种干净、非 hackish 的方法可以在不引入像 virtualenv 和一些 .pth 文件这样的重击者的情况下进行相对导入。无论如何,再次感谢您的帮助。我会将其标记为已回答,因为 virtualenv 是唯一的选择。

最佳答案

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

关于python - 组织多个 Python 应用程序和共享库包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3187064/

相关文章:

java - 是否可以将我自己的类(class)放入第 3 方包中?

java - 如何在 Java 中正确实现包

r - 使用 "R CMD INSTALL"安装R包时如何安装依赖项?

python - 在 Python 中分析文本文件

python - Tensorflow:如何将 EagerTensor 转换为 numpy 数组?

python - 如何避免 matplotlib 饼图中的标签和 autopct 重叠?

python - While True 和条件语句

r - 使用另一个 R 包函数而不使用整个包作为依赖项

python - 如何计算长时间序列数据中连续事件的数量

java - 如何将应用程序构建为多个项目以及如何在 Java 中命名包?