根据Linux文件系统层次结构标准,在哪里放置Python虚拟环境是合适的? 答案:应该将Python虚拟环境放置在/home或/opt目录下,具体取决于您的用例和部署需求。

15
正如标题所问,根据Linux FHS,在Linux操作系统上存储Python虚拟环境的技术正确位置是什么?
换句话说,允许明确回答的方式是:将Python虚拟环境的位置与您正在提供的数据文件分开是否“技术上正确”?
注意:这个问题不同于我能找到的最接近的已经问过的问题,因为虚拟环境包含库、二进制文件、头文件和脚本。
作为一种额外的复杂情况,我倾向于编写支持互联网可访问服务的代码。然而,我认为这并没有从根本上区别我的需求和消费者在同一服务器上的其他进程的情况。我提到这个细节是为了防止我的评论回应包含“Web开发”式的内容。
供参考,我使用以下文档作为我对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应用程序的反向代理的常见场景为例。在使用/srv存储更改较频繁的文件(例如“静态”资源,图像,CSS)的同时,在/usr/local/service_name/下放置虚拟环境和源代码(例如application.py)是否正确?编辑:明确一点:我知道如何使用virtualenvs。我绝不会对项目布局或在开发环境中工作感到困惑。
1个回答

9
正如标题所问,根据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//services/servicename下。
  5. 使用进程管理器启动应用程序,并确保你的进程管理器在运行应用程序代码时切换到第1步中创建的用户。
最后,我再次强调 记录您的过程自动化它

你关于opt的评论恰好符合我提出这个问题的精神。 “静态资源不是动态文件,我认为您在混淆术语”--我可以理解您为什么会这样想,但我相信您会同意CSS文件虽然不是技术上的动态文件,但变化相对频繁。 - user559633
至于您提到的第二点,/home/username是一种客观上错误的做法,因为部署用户可以是没有主目录的系统用户(而且您不希望将部署组织限制在单个用户上)。记住这两点,您关于FHS 约定被作为标准展示的说法是一个有用的提醒。 - user559633
您不会使用与部署应用程序相同的用户运行应用程序(我假设您的“部署”是指“在生产服务器上安装”),因为这将需要提升权限。您不需要“主目录”,而是需要一个标准位置,它可以是您在组织中选择的任何位置。CSS文件很少更改-不像用户上传的图像那样频繁更改。然而,在网站开发中,“静态文件”包括CSS文件。 - Burhan Khalid
我并没有看到在非特权端口上绑定deploy用户有什么特别糟糕的地方。整个问题都围绕着标准位置的正确选择。是的,CSS是静态文件,但我指的是变更频率 -- 根据我的经验(至少如此),CSS、JavaScript和图像资源会定期变更。 - user559633

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接