Virtualenv:如何使自定义 Python 包含由 uWSGI 托管的多组件共享

Virtualenv: How to make a custom Python include shared by multicomponents hosted by uWSGI

我有一个有点复杂的项目设置,其中包含多个协同工作的组件。每个组件都是一个单独的 Python 项目,作为一个 uWSGI 应用程序托管在 Nginx 代理后面。组件通过代理相互交互以及与外界交互。

我注意到自己要将一些代码从一个组件剪切并粘贴到另一个组件,因为它们执行相似的功能,但与不同的服务交互。显然,我想避免这种情况,所以我打算把通用的功能抽出来,放到一个单独的 'library' 项目中,以供不同的组件引用。

我 运行 这些应用程序在虚拟环境中(使用 virtualenv),因此理论上应该很容易将库项目简单地放入 .env/includes.

但是,我的设置有点奇怪。首先,我是 运行 来自 /var/www 的项目(即 uWSGI 从这里托管应用程序),但这些项目实际上存在于另一个源代码控制的目录中。由于各种原因,我不想移动它们,所以我为 /var/www 中的项目目录创建了符号链接。这很好用。但是,现在我有一个潜在的问题,即我也想符号链接的库项目(当前与其他组件位于同一目录中)放在哪里?

我是否将其符号链接到 .env/includes?如果是这样,我应该如何从我的其他组件中引用该库?我是从 sys.path 引用它还是作为兄弟目录引用它? Nginx/uWSGI 是使用 virtualenv 跟随符号链接并考虑实际目录还是盲目地假设所有内容都在 /var/www 中?

这两种方法我都没有尝试过,因为问题的范围似乎很大,所以我想先获得一些意见。不用说,我有点困惑。

我通过将感兴趣的包符号链接到 .env/lib/python2.7/site-packages 中很容易地解决了这个问题。我最初尝试对整个项目文件夹进行符号链接,但没有成功,因为它找不到包。

看来我的uWSGI/Nginx只是遵循了virtualenv的pythonpath版本,所以无论我在那里配置什么都会被使用。

必须记住对每个包进行符号链接会有点痛苦,但至少我只需要为每个包做一次。

我正在使用 PyDev,它掩盖了这个问题,因为我使用的是默认的 Python 解释器,而不是 virtualenv 中的解释器。一旦我改变了它,它就更容易解决了。