ワーパパエンジニアの学び手帳

ワーパパエンジニアの業務外での学びとかガジェットネタとか

Windows上のVagrant環境でvenvがエラーとなった際の対応

現在、下記の本でPythonを使った開発について学んでいます。

Pythonプロフェッショナルプログラミング 第3版

Pythonプロフェッショナルプログラミング 第3版


この書籍では、Windows10にVirtualBoxVagrantをインストールし、ゲストOSとしてUbuntuを利用しホストOSのWindows10とディレクトリを同期することで、Windows10上のエディタでコーディングしながらPythonLinux上で動かすという形で開発を進めていきます。
が、環境を作り、さあ開発を始めていこうというところでいきなり躓いたのでその内容について書いていきます。

目次

環境

書籍に従い、Windows10にVirtualBoxVagrantをインストール、UbuntuのBoxを使います。
バージョンは以下の通り。

>vagrant -v
Vagrant 2.2.3

>vagrant box list
ubuntu/xenial64 (virtualbox, 20190115.0.0)

ゲストOSとディレクトリ同期設定

Vagrantfileを編集し、ホストOSとゲストOSのディレクトリ同期設定をします。

# Vagrantfile
(中略)
  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  config.vm.synced_folder "./src", "/vagrant_data"
(中略)

これで、ホストOSの[Vagrantfileのあるフォルダ]/srcとゲストOSの/vagrant_dataが同期されます。
sshでゲストOSに接続後、このディレクトリ上でvenvコマンドを実行しPythonの仮想環境を作りたいのですが、実行時にエラーが発生しました。

vagrant@ubuntu-xenial:/vagrant_data$ python3.6 -m venv
Error: [Errno 71] Protocol error: 'lib' -> '/vagrant_data/venv/lib64'

シンボリックリンクを貼る際にエラーが出ているみたい

vagrant venv protocol error”あたりで検索しても上位の方はそれらしい情報が出てこず、しばらく寝かせていた(笑)のですが、"windows10"をキーワードに入れると「シンボリックリンク」がキーワードとして挙がってきました。
Windowsシンボリックリンクの機能があること自体知らなかったのですが、どうやらシンボリックリンク作成の権限は管理者ユーザーのみとなっているよう。
venvコマンドを実行するとシンボリックリンクを貼りに行き、Linux上ではできるけど同期を取っているWindows上でその権限がないのでエラーとなっている、というところなのかな。
qiita.com

簡単に解決…

で、どうすれば解決するかというと、Vagrantの起動を管理者ユーザーで実行すればよいとのこと。
一般ユーザーで起動した状態から管理者ユーザーでreloadしてもダメでした。一度落としたうえで起動しなおす必要があるようです。

(管理者ユーザーでコマンドプロンプト起動)
>vagrant halt

>vagrant up

>vagrant ssh

(以下ゲストOS上)
vagrant@ubuntu-xenial:~$ cd /vagrant_data

vagrant@ubuntu-xenial:/vagrant_data$ python3.6 -m venv venv

vagrant@ubuntu-xenial:/vagrant_data$ source venv/bin/activate
(venv) vagrant@ubuntu-xenial:/vagrant_data$

Windows Proであればローカルセキュリティポリシーを編集することで一般ユーザーにシンボリックリンク作成の権限を与えることもできますが、Homeではできないのでひとまずこの方法が楽かなと思います。