假设我正在为我的雇主写两份申请,我们称之为 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 ,但我不能只将“导入PackageB”放入主文件中这些申请。 Python不会在父目录中搜索要导入的包。
我知道有几种方法可以做到这一点,但它们看起来都有点难看。我之前使用过的一种策略是将 App1 和 App2 的主文件放入“repo_root”目录。然后两个主文件可以导入包没有任何问题。另一种选择是使用sys.path.append和 file 来确定父目录是什么,并将其添加到Python搜索模块的路径中。
是否有一种干净,优雅的方式来做这样的事情?谢谢你的帮助。
更新虽然virtualenv解决方案在处理软件包和依赖项时可以提供很多帮助,但对于可以通过相对导入解决的问题来说,这似乎有些过分。然而,进行相对导入似乎是非常复杂的。有PEP 366,但这很复杂,可能不允许在包外导入。我花了一些时间看importlib,但我很确定不允许在包外导入。很多人似乎都在使用sys.path,其中this似乎是我发现的最好的例子。但是,正如我所提到的,这似乎是一种相当神圣的做事方式。我几乎整天都花在调查这个问题上,我认为没有答案。如果我错了,请纠正我,但我现在相信没有像virtualenv和一些.pth文件这样的重击手,没有干净的,非hackish的方式进行相对导入。无论如何,再次感谢您的帮助。我将此标记为已回答,因为virtualenv是唯一的选择。
答案 0 :(得分:3)
您可以使用的一个解决方案是为每个应用设置virtualenv,然后使用相对.pth文件指向包。这使您可以很好地控制正在开发的每个应用程序的环境,并避免“但我的机器上有package_x!”测试中的问题。
答案 1 :(得分:1)
virtualenv是处理此类问题的干净而优雅的方式。阅读引物,然后阅读pypi上的摘要,然后安装并尝试一下!