根据Linux文件系统层次结构标准放置Python虚拟环境的适当位置在哪里?

时间:2014-06-22 02:43:32

标签: python linux virtualenv fhs

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

说明另一种方式可以得出一个明确的答案:它是否在技术上是正确的"将Python虚拟环境的位置与您正在服务的数据文件分开?

注意:This question differs from the closest, already-asked question I could find,因为虚拟环境包含库,二进制文件,头文件和脚本。

作为一个额外的复杂功能,我倾向于编写支持互联网可访问服务的代码。但是,我并不认为这可以将我的需求与服务的消费者是同一服务器上的其他进程的情况大不相同。我提到这个细节,以防我对评论的回复包括" web dev" -esque content。

作为参考,我使用以下文档作为我对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 /应该是mounted read-only according to the FHS。我觉得这很奇怪,因为我从来没有在一个项目上工作,在这个项目中,开发发生的速度非常慢,以及#read; remmount只读取/重新安装,只读,卸载/重新安装为只读"被认为是值得的。

/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/下放置虚拟环境和源代码(例如application.py),对于更频繁更改的文件使用/srv是否正确(例如'静态'资产,图像,css)?

编辑:要明确:我知道为什么以及如何使用virtualenvs。我对项目布局或在开发环境中工作并不感到困惑。

1 个答案:

答案 0 :(得分:4)

  

正如标题所要求的那样,技术上适当的存储位置是什么   Linux操作系统上的Python虚拟环境   Linux FHS?

请注意,Linux FHS并非真正的标准,它是一套指南。它只被LSB称为标准 - 这只是一堆使Linux更容易支持的规则。

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

对我而言,放置虚拟环境的明确选择是/opt,因为此位置为reserved for the installation of add-on software packages

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

因此,我建议使用/usr/local(如果您的普通用户帐户可以写入) - 但在主目录中安装它并没有错。

  

说明了另一种允许明确答案的方式:它是“技术上的”   更正“分隔Python虚拟环境的位置   您正在服务的数据文件?

我不确定您所使用的“数据文件”的含义,但以下是虚拟环境的规则:

  1. 不要将它们放在源代码管理中。
  2. 维护installed packages列表,并将放入版本控制中。请记住,虚拟环境不是完全可移植的。
  3. 将您的虚拟环境与源代码分开。
  4. 鉴于上述情况,您应该将虚拟环境与源代码分开。

      

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

    静态资产不是动态文件,我认为你的条款令人困惑。

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

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