正如标题所问,根据 Linux FHS,在 Linux 操作系统上存储 Python 虚拟环境的技术上合适的位置是什么?
用另一种方式来给出明确的答案:将 Python 虚拟环境的位置与您所服务的数据文件分开是否“技术上正确”?
注意:这个问题与我能找到的最接近的已经提出的问题不同,因为虚拟环境包含库、二进制文件、头文件和脚本。
作为一个额外的复杂因素,我倾向于编写支持互联网访问服务的代码。但是,我不认为这将我的需求与服务的消费者是同一服务器上的其他进程的场景区分开来。我会提到这个细节,以防我对评论的回复包括“网络开发”式的内容。
作为参考,我使用以下文档作为我对 Linux FHS 的定义:http: //www.pathname.com/fhs/pub/fhs-2.3.html
我不相信流行的 virtualenv-wrapper 脚本会建议正确的操作,因为它默认将虚拟环境存储在用户的主目录中。这违反了目录是用于用户特定文件的隐含概念,以及“任何程序都不应依赖此位置”的声明。
从文件系统的根级别,我倾向于/usr
(可共享的只读数据)或/srv
(由该系统提供的服务的数据),但这是我很难进一步决定的地方。
如果我要接受我的首选反向代理的决定,那就意味着/usr
. Nginx 通常被打包到 /usr/share/nginx 或 /usr/local/nginx 中,但是, /usr/ 应该根据 FHS 以只读方式挂载。我觉得这很奇怪,因为我从来没有参与过一个开发如此缓慢的项目,以至于“以只读方式卸载/以写入方式重新挂载,以只读方式卸载/重新挂载”被认为值得付出努力。
/srv
是另一个可能的位置,但被称为“特定服务的数据文件的位置”,而 Python 虚拟环境更侧重于提供服务的库和二进制文件(如果没有这种区别,.so
文件也将位于 srv 中) . 此外,具有相同需求的多个服务可以共享一个虚拟环境,这违反了描述的“特定”细节。
我相信选择正确位置的部分困难是因为虚拟环境是一个“环境”,它由二进制文件和库组成(几乎就像它自己的小层次结构),这让我觉得下面的某个地方/usr
更传统:
virtual-env/
├── bin ~= /usr/local : "for use by the system administrator when installing software locally"
├── include ~= /usr/include : "Header files included by C programs"
├── lib ~= /usr/lib : "Libraries for programming and packages"
└── share ~= /usr/local
根据我的假设和想法:考虑 Nginx 作为 Python 应用程序的反向代理的常见场景。/usr/local/service_name/
在使用/srv
更频繁更改的文件(例如“静态”资产、图像、css)时放置虚拟环境和源代码(例如application.py)是否正确?
编辑:要清楚:我知道为什么以及如何使用 virtualenvs。我绝不会对项目布局或在开发环境中工作感到困惑。