首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >完全自给虚拟环境

完全自给虚拟环境
EN

Stack Overflow用户
提问于 2016-01-27 10:50:31
回答 2查看 6K关注 0票数 17

我创建了一个python3虚拟环境(使用--copies显式地避免符号链接):

代码语言:javascript
复制
» python3 -m venv --without-pip --copies venv

这是我现在完整的虚拟环境:

代码语言:javascript
复制
» tree venv/
venv/
├── bin
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── python
│   └── python3
├── include
├── lib
│   └── python3.4
│       └── site-packages
├── lib64 -> lib
└── pyvenv.cfg

我禁用了PYTHONPATH,以确保没有从外部泄漏:

代码语言:javascript
复制
» PYTHONPATH=""

激活静脉:

代码语言:javascript
复制
» source venv/bin/activate

验证activate没有污染我的PYTHONPATH

代码语言:javascript
复制
» echo $PYTHONPATH

(空白,如预期)

我正在使用正确的python:

代码语言:javascript
复制
» which python
/foo/bar/venv/bin/python

但仍在访问系统模块:

代码语言:javascript
复制
» python 
Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import unittest
>>> print(unittest)
<module 'unittest' from '/usr/lib/python3.4/unittest/__init__.py'>
>>> 

我希望import unittest语句失败,因为虚拟环境中没有这样的模块。

我想知道:

  • 为什么在虚拟环境中访问系统包?
  • 如何创建一个完全独立的虚拟环境?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-27 10:58:44

如果我没记错的话,核心系统包是符号链接的,所以它们是相同的文件(部分原因是为了减小虚拟服务器的大小)。

默认情况下不包括site-packages目录,因此它不会访问已安装的第三方库。

如果您想要真正地隔离和自我包含的虚拟环境,您可能会更好地看看docker

Virtualenv实际上是管理不同应用程序的不同第三方安装包的一种轻量级方法。

编辑:

看起来--always-copy并不总是复制所有文件:

virtualenv不复制lib/python目录中的所有.py文件

深入挖掘源代码,看起来有一小部分模块被认为是“必需的”,这些模块是复制的:

https://github.com/pypa/virtualenv/blob/ac4ea65b14270caeac56b1e1e64c56928037ebe2/virtualenv.py#L116

编辑2:

您可以看到,旧的python目录仍然出现在sys.path中,但是在虚拟服务器本身的目录之后:

代码语言:javascript
复制
>>> import sys
>>> sys.path
['', '/home/john/venv/lib/python2.7', 
'/home/john/venv/lib/python2.7/plat-linux2', 
'/home/john/venv/lib/python2.7/lib-tk',
'/home/john/venv/lib/python2.7/lib-old', 
'/home/john/venv/lib/python2.7/lib-dynload', '/usr/lib/python2.7',
'/usr/lib/python2.7/plat-linux2',
'/usr/lib/python2.7/lib-tk',
'/home/john/venv/local/lib/python2.7/site-packages',
'/home/john/venv/lib/python2.7/site-packages']
票数 9
EN

Stack Overflow用户

发布于 2021-11-10 01:56:26

您可以在旧Linux上从源代码构建python;然后python将是完全独立的,并且能够在许多Linux上运行。

在参考链接中,具体步骤是在容器env中的centos 5上构建python3.6。输出可用于许多Linux,如debian 10,centos 6,7,8,光子3,高寒,.

  • readline-devel:启用python命令行历史记录
  • sqlite-devel:启用sqlite支持
  • expat-devel:启用xmltree支持
  • bzip2-devel:启用bzip2支持
  • 从源代码编译SSL以避免动态lib链接
  • 如果python的更高版本,可能还需要编译更高版本的gcc,以获得完整的C++11和更高的支持。
  • 编译后,您需要从pypi.python.org下载setuptools和pip,并执行python setup.py install来为这个独立的python做好准备。

参考文献:https://github.com/stallpool/track-network-traffic#mitmproxy-for-manylinux

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35035274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档