16

仮想環境を作成しpython3ます(シンボリックリンクを明示的に回避します--copies):

» python3 -m venv --without-pip --copies venv

これが私の完全な仮想環境です。

» tree venv/
venv/
├── bin
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── python
│   └── python3
├── include
├── lib
│   └── python3.4
│       └── site-packages
├── lib64 -> lib
└── pyvenv.cfg

を無効にしてPYTHONPATH、外部から何も漏れていないことを確認します。

» PYTHONPATH=""

venv を有効にします。

» source venv/bin/activate

activatemy を汚染していないことを確認しPYTHONPATHます。

» echo $PYTHONPATH

(空白、予想通り)

私は正しいpythonを使用しています:

» which python
/foo/bar/venv/bin/python

ただし、システム モジュールには引き続きアクセスしています。

» 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仮想環境にはそのようなモジュールがないため、ステートメントは失敗すると思います。

私が知りたいのですが:

  • virtualenv でシステム パッケージにアクセスするのはなぜですか?
  • 完全に自己完結型の仮想環境を作成するにはどうすればよいですか?
4

2 に答える 2

9

私の記憶が正しければ、コア システム パッケージはシンボリック リンクされているため、それらは同じファイルです (virtualenv のサイズを抑えるための一部です)。

デフォルトでは、site-packagesディレクトリは含まれないため、インストールされているサード パーティのライブラリにはアクセスしません。

真に分離された自己完結型の仮想環境が必要な場合は、dockerを検討することをお勧めします。

Virtualenv は、さまざまなアプリ用にさまざまなサードパーティがインストールしたパッケージを管理する、より軽量な方法です。

編集:

--always-copy実際には常にすべてのファイルをコピーするとは限らないようです:

virtualenv が lib/python ディレクトリからすべての .py ファイルをコピーしない

ソースを掘り下げると、「必須」と見なされる小さなモジュールのセットがあり、これらはコピーされるものです。

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

編集2:

古い python ディレクトリがまだ に表示されていることがわかりますがsys.path、virtualenv 自体のディレクトリの後にあります。

>>> 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']
于 2016-01-27T10:58:44.693 に答える