根据Linux文件系统层次标准,哪里是放置Python虚拟环境的合适位置



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

以另一种方式给出了一个明确的答案:将Python虚拟环境的位置与所提供的数据文件分开是否"技术上正确"?

注意:这个问题与我能找到的最接近的、已经问过的问题不同,因为虚拟环境包含库、二进制文件、头文件和脚本。

作为一个额外的复杂性,我倾向于编写支持互联网访问服务的代码。但是,我不认为这是我的需求与服务的消费者是同一服务器上的其他进程的场景的本质区别。我提到这个细节,以防我对评论的回应包括"web开发"式的内容。

作为参考,我使用以下文档作为我对Linux FHS的定义:http://www.pathname.com/fhs/pub/fhs-2.3.html

我不认为流行的virtualenv-wrapper脚本建议正确的操作,因为它默认将虚拟环境存储在用户的主目录中。这违反了目录用于特定于用户的文件的隐含概念,以及"任何程序都不应该依赖于此位置"的声明。

从文件系统的根级别来看,我倾向于/usr(可共享的只读数据)或/srv(该系统提供的服务的数据),但这是我很难进一步决定的地方。

如果我要跟随我的go-to反向代理的决定,这意味着/usr。Nginx通常被打包到/usr/share/Nginx或/usr/local/Nginx中,然而,根据FHS,/usr/应该是只读挂载的。我觉得这很奇怪,因为我从来没有参与过一个开发速度如此缓慢的项目,以至于"卸载为只读/重挂为写,卸载/重挂为只读"被认为是值得的。

/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应用程序的反向代理的常见场景。将虚拟环境和源代码(例如application.py)放在/usr/local/service_name/下,而将更改更频繁的文件(例如application.py)使用/srv是否正确?"静态"资产,图像,css)?澄清一下:我知道为什么和如何使用virtualenvs。我绝不对项目布局或在开发环境中工作感到困惑。

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

请记住,Linux FHS并不是真正的标准,它是一组指导方针。它只被LSB称为标准——它只是一堆使支持Linux更容易的规则。

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

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

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

所以,我会推荐/usr/local(如果它可以被你的普通用户帐户写入)-但是安装在你的主目录下没有什么错。

用另一种方式给出了一个明确的答案:是"技术上"吗将Python虚拟环境的位置与您正在提供的数据文件?

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

  1. 维护已安装包的列表,并将这个放在版本控制中。请记住,虚拟环境并非完全可移植。
  2. 把你的虚拟环境和你的源代码分开。

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

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

静态资产不是动态文件,我想你混淆了术语。

无论哪种方式,你都应该这样做:

  1. 创建一个用户帐户来运行该应用程序。
  2. 应用程序文件放在由该用户控制的目录下,并且仅该用户。通常这是/home/username目录,但您也可以将其改为/services/servicename。以标准命名格式将虚拟环境放置为该目录的子集。例如,我使用env
  3. 把你的静态资产,比如所有的媒体文件,css文件等放在一个前端服务器可以读的目录中。所以,通常你会创建一个www目录或public_html目录。
  4. 确保您为这个应用程序创建的用户帐户具有对这个资产目录的写访问权限,以便您能够更新文件。代理服务器不应该对该目录具有执行权限。您可以通过将目录的组更改为与代理服务器用户的组相同来实现这一点。考虑到这一点,我会把这个目录放在/home/username//services/servicename下。
  5. 使用进程管理器启动应用程序,并确保您的进程管理器在运行应用程序代码时将用户切换到步骤1中创建的用户。

最后,我再怎么强调也不为过DOCUMENT YOUR PROCESS and automated IT

相关内容

  • 没有找到相关文章