【发布时间】:2010-07-07 03:53:02
【问题描述】:
假设我正在为我的雇主编写两个应用程序,我们将它们称为 App1 和 App2。这些应用程序依赖于一些包含两者所需代码的包。假设 App1 依赖于 PackageA 和 PackageB。 App2 依赖于 PackageB 和 PackageC。对我来说似乎很自然的组织策略是将所有内容都检查到版本控制中,如下所示:
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
问题在于导入包。比如App1和App2都需要导入PackageB,但是我不能只把“import PackageB”放到主文件中这些应用程序。 Python 不会在父目录中搜索要导入的包。
我知道有几个选项可以做到这一点,但它们看起来都有点难看。我之前使用的一种策略是将 App1 和 App2 的主文件放入“repo_root”目录。然后这两个主要文件可以毫无问题地导入包。另一种选择是使用 sys.path.append 和 file 找出父目录是什么,并将其添加到 Python 搜索模块的路径中。
有没有一种干净、优雅的方式来做这样的事情?感谢您的帮助。
更新:虽然 virtualenv 解决方案在处理包和依赖项方面可以提供很大帮助,但对于可以通过相对导入解决的问题来说,这似乎有点过头了。然而,执行相对导入似乎异常复杂。有PEP 366,但这很复杂,可能无论如何都不允许在包之外导入。我花了一些时间查看importlib,但我很确定这也不允许在包之外导入。许多人似乎使用 sys.path 的 munging,其中this 似乎是我找到的最好的例子。但是,正如我所提到的,这似乎是一种相当老套的做事方式。我几乎整天都在调查这个问题,我认为没有答案。如果我错了,请纠正我,但我现在相信,在不引入像 virtualenv 和一些 .pth 文件这样的重量级人物的情况下,没有干净、非黑客的方式来进行相对导入。无论如何,再次感谢您的帮助。我会将其标记为已回答,因为 virtualenv 是唯一的选择。
【问题讨论】: