10

正如标题所问,根据 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。我绝不会对项目布局或在开发环境中工作感到困惑。

4

1 回答 1

6

正如标题所问,根据 Linux FHS,在 Linux 操作系统上存储 Python 虚拟环境的技术上合适的位置是什么?

请记住,Linux FHS并不是一个真正的标准,它是一套指南。它仅被 LSB 称为标准——这只是一堆使支持 Linux 更容易的规则。

/run, /sys,/proc/usr/local都不是 LFS 的一部分,但你可以在大多数 linux 发行版中看到它们。

对我来说,放置虚拟环境的明确选择是/opt,因为这个位置是为安装附加软件包而保留的

但是,在大多数 Linux 发行版上,只有 root 可以写入/opt,这使得这是一个糟糕的选择,因为虚拟环境的主要目标之一是避免成为 root。

所以,我会推荐/usr/local(如果它可以由您的普通用户帐户写入) - 但是将它安装在您的主目录中没有任何问题。

用另一种方式来给出明确的答案:将 Python 虚拟环境的位置与您所服务的数据文件分开是否“技术上正确”?

我不确定“您正在服务的数据文件”是什么意思,但以下是虚拟环境的规则:

  1. 不要将它们置于源代码控制中。
  2. 维护已安装包的列表,并将放入版本控制中。请记住,虚拟环境并不是完全可移植的。
  3. 将您的虚拟环境与源代码分开。

鉴于上述情况,您应该将虚拟环境与源代码分开。

考虑 Nginx 作为 Python 应用程序的反向代理的常见场景。将虚拟环境和源代码(例如 application.py)放置在 /usr/local/service_name/ 下是否正确,同时将 /srv 用于更多动态文件(例如“静态”资产、图像)?

静态资产不是动态文件,我认为您混淆了术语。

无论哪种方式,您都应该执行以下操作:

  1. 创建一个用户帐户来运行该应用程序。
  2. 应用程序文件放在由该用户和该用户单独控制的目录下。通常这是/home/username目录,但您可以将其设为/services/servicename. 以标准命名格式将虚拟环境作为该目录的子集放置。例如,我使用env.
  3. 将您的静态资产(例如所有媒体文件、css 文件等)放在前端服务器可读的目录中。因此,通常您会创建一个www目录或public_html目录。
  4. 确保您为此应用程序创建的用户帐户对此资产目录具有写入权限,以便您能够更新文件。代理服务器不应对此目录具有执行权限。您可以通过将目录组更改为与代理服务器用户相同的组来完成此操作。鉴于此,我会将这个目录放在/home/username/or下/services/servicename
  5. 使用流程管理器启动应用程序,并确保您的流程管理器在运行应用程序代码时将用户切换到在步骤 1 中创建的用户。

最后,我不能再强调这一点了记录您的流程并使其自动化

于 2014-06-22T04:31:54.327 回答