Pipenv というものがあることを知りました。 ので、使ってみたいと思います。
環境
- Ubuntu 18.04 LTS
- Python 3.6.5
- Pipenv 2018.5.18
Pipenv?
Pipenv は、全てのパッケージングの世界 (bundler、composer、npm、cargo、yarnなどなど。) における最高のものをPythonの世界にもたらすことを目的としたツールです。 我々の世界ではWindowsは第一級市民です。
Pipenv は Ruby の bundler や Node.js の npm のようなものみたいです。
Pipenv is a project that aims to bring the best of all packaging worlds to the Python world. It harnesses Pipfile, pip, and virtualenv into one single toolchain. It features very pretty terminal colors.
Python の公式サイトにも Pipenv の記載がありました。 Pipfile と pip と virtualenv を一つのツールチェーンに統合したもののようです。
ソフトウェア分野におけるツールチェーン(英: toolchain)は、製品(典型的には他のコンピュータ用のプログラム、またはシステムプログラム)を製作するのに使われるプログラム(ツール)の集合体である。一つのツールの出力が他のツールの入力となり、連鎖的に使われることからツールチェーンと呼ばれる。
toolchain という単語をあまり使ったことがありませんでしたが、プログラム(ツール)の集合体のことみたいです。
Currently, there are two common tools for creating Python virtual environments:
- venv is available by default in Python 3.3 and later, and installs pip and setuptools into created virtual environments in Python 3.4 and later.
- virtualenv needs to be installed separately, but supports Python 2.6+ and Python 3.3+, and pip, setuptools and wheel are always installed into created virtual environments by default (regardless of Python version).
The basic usage is like so:
Using virtualenv:
virtualenv <DIR> source <DIR>/bin/activate
Using venv:
python3 -m venv <DIR> source <DIR>/bin/activate
For more information, see the [virtualenv](For more information, see the virtualenv docs or the venv docs.) docs or the venv docs.
今までは python3 -m venv <DIR>
を使って仮想環境を作って、仮想環境の中で pip
を使ってパッケージをインストールしていました。
それぞれコマンドが異なるので面倒と言えば面倒でした。
仮想環境を作る方法も virtualenv と venv の 2 種類あったみたいで煩わしいですし。
それらが統合されたら嬉しいかもしれません。
それから、 virtualenv は、仮想環境を有効にするのに source <DIR>/bin/activate
をして、無効にするのに deactivate
をしなきゃいけません。
これはけっこう面倒でした。
もっと気になっているのは、仮想環境のディレクトリーを移動すると、また仮想環境を作り直さなきゃいけない (python3 -m venv <DIR>
) ところです。
(コマンド 1 回だけ実行すれば済む話ですけれども)
(--without-pip
で仮想環境を作っている場合は python get-pip.py
も実行する必要がありますけれども)
これは、 <DIR>/bin/activate の中に記述されている仮想環境のディレクトリーへの絶対パスが、移動した先のディレクトリーのパスと相違してしまうためです。
すると source <DIR>/bin/activate
をしても、正しい状態で仮想環境を有効にすることができません。
これは改善されているかな?
pip のインストール
pipを使いましょう:
$ pip install pipenv
あるいは、Ubuntu 17.10を使っている場合には次のようにします:
$ sudo apt install software-properties-common python-software-properties $ sudo add-apt-repository ppa:pypa/ppa $ sudo apt update $ sudo apt install pipenv
そうでなくMacOSを使っている場合は、Homebrewで簡単にPipenvがインストールできます:
$ brew install pipenv
Pipenv のインストールにはいくつか方法があるようです。
Ubuntu を使っているので apt
を使うのがいいのかもしれません。
が、リポジトリーの追加とかあまりしたくないので pip を使おうと思います。
以前、 Ubuntu 16.04 LTS のときに記事にしましたが、 WSL の Ubuntu 18.04 にも pip がないので pip からインストールしてみます。
今まで pip なしで仮想環境を作って、その中に pip をインストールしていたのですが、 Pipenv でも仮想環境を作りたいです。
すると、 Pipenv のための仮想環境の中に、アプリケーションのための仮想環境を作れなきゃいけないことになるので、よくわからないことになりそうです。
Pipenv のための仮想環境を作るのに、毎回 python3 -m venv <DIR>
を使うのも無意味な気がします。
せっかく Pipenv を使うなら Pipenv だけで済ませたいです。
シンプルにしたいので、素直に仮想環境の外に pip と Pipenv をインストールすることにしました。
To install pip, securely download get-pip.py. [1]:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
pip をインストールするために get-pip.py をダウンロードします。
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1603k 100 1603k 0 0 2953k 0 --:--:-- --:--:-- --:--:-- 2953k
ダウンロードできました。
Inspect get-pip.py for any malevolence. Then run the following:
python get-pip.py
ダウンロードした get-pip.py ファイルを python
コマンドで実行してあげればいいみたいです。
ただ、このままだと /usr/ や /usr/local/ あたりのディレクトリーにインストールするようで、 sudo
をつけてあげる必要があるみたいです。
Install to the user site [3]:
python get-pip.py --user
--user
オプションをつけてあげるとユーザーのホームディレクトリーの中にインストールしてくれるみたいです。
こうすると、このユーザーしか使えなくなりますが、 sudo
をつける必要がありません。
OS に近い領域を汚すことがないので、こっちの方がいいかな、と思っています。
Ubuntu 18.04 LTS の python は 3 なので python3
コマンドで実行しました。
$ python3 get-pip.py --user
Traceback (most recent call last):
File "get-pip.py", line 20649, in <module>
main()
File "get-pip.py", line 197, in main
bootstrap(tmpdir=tmpdir)
File "get-pip.py", line 82, in bootstrap
import pip._internal
File "/tmp/tmpetizv62h/pip.zip/pip/_internal/__init__.py", line 42, in <module>
File "/tmp/tmpetizv62h/pip.zip/pip/_internal/cmdoptions.py", line 16, in <module>
File "/tmp/tmpetizv62h/pip.zip/pip/_internal/index.py", line 25, in <module>
File "/tmp/tmpetizv62h/pip.zip/pip/_internal/download.py", line 35, in <module>
File "/tmp/tmpetizv62h/pip.zip/pip/_internal/locations.py", line 10, in <module>
ImportError: cannot import name 'sysconfig'
エラーになりました。
It seems that python3-distutils is not installed.
sudo apt install python3-distutils
fix this issue.
ImportError: cannot import name ‘sysconfig’ · Issue #5356 · pypa/pip · GitHub
これと同じ状況みたいでした。
なので、最初に distutils をインストールすることにしました。
$ apt search python3-distutils
Sorting... Done
Full Text Search... Done
python3-distutils/bionic 3.6.5-3 all
distutils package for Python 3.x
探してみたら標準のリポジトリーの中にありました。
インストールします。
$ sudo apt install python3-distutils
[sudo] password for user:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libfreetype6
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
python3-lib2to3
The following NEW packages will be installed:
python3-distutils python3-lib2to3
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 217 kB of archives.
After this operation, 2118 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 python3-lib2to3 all 3.6.5-3 [76.6 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic/main amd64 python3-distutils all 3.6.5-3 [141 kB]
Fetched 217 kB in 4s (61.1 kB/s)
Selecting previously unselected package python3-lib2to3.
(Reading database ... 28482 files and directories currently installed.)
Preparing to unpack .../python3-lib2to3_3.6.5-3_all.deb ...
Unpacking python3-lib2to3 (3.6.5-3) ...
Selecting previously unselected package python3-distutils.
Preparing to unpack .../python3-distutils_3.6.5-3_all.deb ...
Unpacking python3-distutils (3.6.5-3) ...
Setting up python3-lib2to3 (3.6.5-3) ...
Setting up python3-distutils (3.6.5-3) ...
python3-distutils がインストールできました。
改めて pip をインストールします。
$ python3 get-pip.py --user
Collecting pip
Downloading https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl (1.3MB)
100% |████████████████████████████████| 1.3MB 1.7MB/s
Collecting setuptools
Downloading https://files.pythonhosted.org/packages/7f/e1/820d941153923aac1d49d7fc37e17b6e73bfbd2904959fffbad77900cf92/setuptools-39.2.0-py2.py3-none-any.whl (567kB)
100% |████████████████████████████████| 573kB 3.6MB/s
Collecting wheel
Downloading https://files.pythonhosted.org/packages/81/30/e935244ca6165187ae8be876b6316ae201b71485538ffac1d718843025a9/wheel-0.31.1-py2.py3-none-any.whl (41kB)
100% |████████████████████████████████| 51kB 5.6MB/s
Installing collected packages: pip, setuptools, wheel
The script wheel is installed in '/home/user/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-10.0.1 setuptools-39.2.0 wheel-0.31.1
インストールできました。
$ which pip
$
pip がありません。
$ which pip3
$
pip3 もありません。
と思ったら、インストールしたときに警告が出ていたことに気づきました。
The script wheel is installed in ‘/home/user/.local/bin’ which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use –no-warn-script-location.
環境変数の PATH に ~/.local/bin を設定してあげなければいけないようでした。
$ ls ~/.local/bin/pip
/home/user/.local/bin/pip
$ ls ~/.local/bin/pip3
/home/user/.local/bin/pip3
~/.local/bin の中には pip がちゃんとあるみたいでした。 なので、この ~/.local/bin ディレクトリーを環境変数の PATH に設定してあげれば使えるようになるみたいです。
設定しようと思って ~/.bashrc や ~/.profile を見ていたところ、 ~/.profile に次の記述がありました。
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi
~/bin ディレクトリーや ~/.local/bin ディレクトリーが作られていると勝手に PATH に追加してくれるようでした。 なので、ここで Ubuntu を起動し直してみました。
$ echo $PATH
/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Windows/System32:/mnt/c/Windows:/mnt/c/Windows/System32/wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0:/mnt/c/Windows/System32/OpenSSH:/mnt/c/Users/q399/AppData/Local/Microsoft/WindowsApps:/mnt/c/Program Files/Microsoft VS Code/bin:/snap/bin
PATH に ~/.local/bin が追加されていました。
$ which pip
/home/user/.local/bin/pip
$ which pip3
/home/user/.local/bin/pip3
pip も pip3 も使える状態になりました。
$ pip -V
pip 10.0.1 from /home/user/.local/lib/python3.6/site-packages/pip (python 3.6)
$ pip3 -V
pip 10.0.1 from /home/user/.local/lib/python3.6/site-packages/pip (python 3.6)
$ pip3.6 -V
pip 10.0.1 from /home/user/.local/lib/python3.6/site-packages/pip (python 3.6)
Python3 しかないから、どの pip も同じバージョンみたいです。
Pipenv のインストール
pip が使える状態になったので Pipenv をインストールしてみます。
次の通り
pip
でPipenvをインストールしてください:$ pip install --user pipenv
注釈
このコマンドは user installation を行い、システム全体に関わるパッケージを壊さないようにします。 インストールを行った後に pipenv が使えるようにならない場合は、 user base のバイナリディレクトリを PATH に追加する必要があります。
Pipenv も user installation できるみたいです。
user installation で Pipenv をインストールしてみます。
$ pip install --user pipenv
Collecting pipenv
Downloading https://files.pythonhosted.org/packages/8d/fe/4faa519acfb984015dde4e2973d89e47baf6a9cd81e9d58e2f2d3c47fb6f/pipenv-2018.5.18-py3-none-any.whl (6.4MB)
100% |████████████████████████████████| 6.4MB 2.3MB/s
Requirement already satisfied: setuptools>=36.2.1 in ./.local/lib/python3.6/site-packages (from pipenv) (39.2.0)
Requirement already satisfied: pip>=9.0.1 in ./.local/lib/python3.6/site-packages (from pipenv) (10.0.1)
Collecting virtualenv (from pipenv)
Downloading https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c35d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl (1.9MB)
100% |████████████████████████████████| 1.9MB 1.7MB/s
Collecting virtualenv-clone>=0.2.5 (from pipenv)
Downloading https://files.pythonhosted.org/packages/6d/c2/dccb5ccf599e0c5d1eea6acbd058af7a71384f9740179db67a9182a24798/virtualenv_clone-0.3.0-py2.py3-none-any.whl
Requirement already satisfied: certifi in /usr/lib/python3/dist-packages (from pipenv) (2018.1.18)
Installing collected packages: virtualenv, virtualenv-clone, pipenv
Successfully installed pipenv-2018.5.18 virtualenv-16.0.0 virtualenv-clone-0.3.0
インストールできました。
仮想環境を作る
Pipenv manages dependencies on a per-project basis. To install packages, change into your project’s directory (or just an empty directory for this tutorial) and run:
cd myproject pipenv install requests
virtualenv みたいに仮想環境を作るという儀式は必要ないみたいです。
pipenv
コマンドを使ってパッケージをインストールすると、必要な管理ファイルを作ってくれるみたいです。
cowsay · PyPI をインストールしてみようと思います。
$ pipenv install cowsay
Creating a virtualenv for this project…
Using /usr/bin/python3 (3.6.5) to create virtualenv…
⠋Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/user/.local/share/virtualenvs/myproject-O_i4omMD/bin/python3
Also creating executable in /home/user/.local/share/virtualenvs/myproject-O_i4omMD/bin/python
Installing setuptools, pip, wheel...done.
Virtualenv location: /home/user/.local/share/virtualenvs/myproject-O_i4omMD
Creating a Pipfile for this project… Installing cowsay…
Collecting cowsay
Downloading https://files.pythonhosted.org/packages/8f/1f/37fbc878a11a2f2cdf680b74f4f8cd8cfbdf464779c6838a0914f2bcea3c/cowsay-1.0.tar.gz
Building wheels for collected packages: cowsay
Running setup.py bdist_wheel for cowsay: started
Running setup.py bdist_wheel for cowsay: finished with status 'done'
Stored in directory: /home/user/.cache/pip/wheels/80/0f/31/20a2777be324396f835d0e0d38205214f4e2826e8bc09b643e
Successfully built cowsay
Installing collected packages: cowsay
Successfully installed cowsay-1.0
Adding cowsay to Pipfile's [packages]…
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (6800d4)!
Installing dependencies from Pipfile.lock (6800d4)…
🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 1/1 — 00:00:00
To activate this project's virtualenv, run the following:
$ pipenv shell
インストールできました。 インストールにはけっこう時間がかかった感じがします。 30 秒くらい待ったような。
$ ls
Pipfile Pipfile.lock
2 つのファイルができました。
$ ls /home/user/.local/share/virtualenvs/myproject-O_i4omMD
bin lib pip-selfcheck.json
それから ~/.local/share/virtualenvs の下に仮想環境のディレクトリーが作られました。 この中に pip でインストールするパッケージとかが保存されるぽいです。
myproject-O_i4omMD を - で区切って、 myproject の部分は実際のディレクトリーの名前に対応しているみたいです。 後ろの O_i4omMD の部分は実際のディレクトリーの絶対パスに対するハッシュなのかな? 同じ名前のディレクトリーを別のパスのところに作ったら、この後ろの 8 桁のところだけ変わったものになりました。 /home/user/myproject の仮想環境を作って、削除して、もう一度作り直したら、また同じ myproject-O_i4omMD の名前で作られました。 なので、絶対パスで一意に識別できるようになっているぽいです。
Pipenvで作成された仮想環境は、予想したものと異なっているかもしれません。 危険な文字 (つまり、空白、ラインフィード、キャリッジリターン、タブだけでなく $`!*@” も) はアンダースコアに変換されます。 さらに、現在のフォルダのフルパスは 「スラッグ値」 にエンコードされ、仮想環境名が一意になるように末尾に追加されます。
それらしいことが書いてありました。 後ろの 8 桁は「スラッグ値」と呼ぶそうです。
パッケージを使う
Now that Requests is installed you can create a simple
main.py
file to use it:import requests response = requests.get('https://httpbin.org/ip') print('Your IP is {0}'.format(response.json()['origin']))
Then you can run this script using
pipenv run
:pipenv run python main.py
You should get output similar to this:
Your IP is 8.8.8.8
Using
pipenv run
ensures that your installed packages are available to your script. It’s also possible to spawn a new shell that ensures all commands have access to your installed packages withpipenv shell
.
Pipenv でインストールしたパッケージを使って動かすには pipenv run
コマンドを使うみたいです。
source <DIR>/bin/activate
をする代わりに、毎回 pipenv run
で動かすことになります。
どうかな?
逆に面倒だと感じる人もいるかもしれないです。
けれども、わたしは pipenv run
で動かす方がいいと感じます。
インストールした cowsay を使ってみます。
$ pipenv run python
Python 3.6.5 (default, Apr 1 2018, 05:46:30)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cowsay
>>> cowsay.tux("Python is fun")
_____________
< Python is fun >
=============
\
\
\
.--.
|o_o |
|:_/ |
// \ \
(| | )
/'\_ _/`\
\___)=(___/
>>> exit()
インタプリターでも動かせました。
virtualenv みたいに終わった後に deactivate
する必要がないところがいいです。
プロジェクトのディレクトリーの移動
virtualenv はプロジェクトのディレクトリーを移動すると python3 -m venv <DIR>
し直す必要があったので、 Pipenv ではどうなのか確認してみました。
$ cd ..
$ mv myproject myproject2
$ cd myproject2
$ pipenv run python
Creating a virtualenv for this project…
Using /usr/bin/python3.6m (3.6.5) to create virtualenv…
⠋Running virtualenv with interpreter /usr/bin/python3.6m
Using base prefix '/usr'
New python executable in /home/user/.local/share/virtualenvs/myproject2-v0_H80Xk/bin/python3.6m
Also creating executable in /home/user/.local/share/virtualenvs/myproject2-v0_H80Xk/bin/python
Installing setuptools, pip, wheel...done.
Virtualenv location: /home/user/.local/share/virtualenvs/myproject2-v0_H80Xk
Python 3.6.5 (default, Apr 1 2018, 05:46:30)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
ダメみたいでした。 別の名前の ~/.local/share/virtualenvs/myproject2-v0_H80Xk が作られてしまいました。
仮想環境の削除
–rm Remove the virtualenv.
myproject2 の ~/.local/share/virtualenvs にある仮想環境を削除しておきます。
--rm
のオプションで削除できるみたいです。
$ pipenv --rm
Removing virtualenv (/home/user/.local/share/virtualenvs/myproject2-v0_H80Xk)…
削除できたみたいです。
なんか、不用意に仮想環境に対する実際のディレクトリーを移動してしまうと、 ~/.local/share/virtualenvs の下にある仮想環境のディレクトリーがどこにも関連していない状態になりそうで気持ち悪い感じがします。 なんで実際のディレクトリーの下に pip のファイルとか保存しないのだろう?
myproject2 のディレクトリーの名前を myproject に戻しておきます。
$ cd ..
$ mv myproject2 myproject
$ cd myproject
パッケージのアンインストール
$ pipenv uninstall
は pipenv install の全てのパラメータに加えて、--all
と--all-dev
もサポートしています。
--all
— このパラメータを付けると、仮想環境から全てのファイルを除去しますが、Pipfileだけは触らずに残します。--all-dev
— このパラメータを付けると、開発環境の全てのパッケージを仮想環境から除去し、Pipfileからも削除します。
全てのパッケージをまとめて削除できるようです。
最初に Pipfile の中身を確認しておきます。
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
cowsay = "*"
[dev-packages]
[requires]
python_version = "3.6"
[packages]
のところに cowsay があります。
仮想環境の中の site-packages も確認しておきます。
$ ls ~/.local/share/virtualenvs/myproject-O_i4omMD/lib/python3.6/site-packages/
__pycache__ easy_install.py pkg_resources wheel
cowsay pip setuptools wheel-0.31.1.dist-info
cowsay-1.0.dist-info pip-10.0.1.dist-info setuptools-39.2.0.dist-info
cowsay があります。
$ pipenv uninstall --all-dev
Un-installing [dev-packages]…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (6800d4)!
アンインストールできました。
Pipfile の中身です。
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
cowsay = "*"
[dev-packages]
[requires]
python_version = "3.6"
うーん、まだ cowsay がありますね。
仮想環境の中の site-packages です。
$ ls ~/.local/share/virtualenvs/myproject-O_i4omMD/lib/python3.6/site-packages/
__pycache__ easy_install.py pkg_resources wheel
cowsay pip setuptools wheel-0.31.1.dist-info
cowsay-1.0.dist-info pip-10.0.1.dist-info setuptools-39.2.0.dist-info
うーん、こちらもまだ cowsay がありますね。
個別にアンインストールしてみます。
$ pipenv uninstall cowsay
Un-installing cowsay…
Uninstalling cowsay-1.0:
Successfully uninstalled cowsay-1.0
Removing cowsay from Pipfile…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (ca72e7)!
アンインストールできました。
Pipfile の中身です。
$ cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
[dev-packages]
[requires]
python_version = "3.6"
ちゃんと cowsay がなくなってました。
仮想環境の中の site-packages です。
$ ls ~/.local/share/virtualenvs/myproject-O_i4omMD/lib/python3.6/site-packages/
__pycache__ pip pkg_resources setuptools-39.2.0.dist-info wheel-0.31.1.dist-info
easy_install.py pip-10.0.1.dist-info setuptools wheel
こちらもちゃんと cowsay がなくなってました。
--all
と --all-dev
のオプションがうまく動いていないのかな?
それともわたしの認識が誤っているのかな?
プロジェクトのホームのディレクトリー
–where Output project home information.
--where
オプションでプロジェクトのパスが確認できるみたいです。
$ pipenv --where
/home/user/myproject
うーん、これはプロジェクトのホームで pipenv
のコマンドを実行する必要があるわけだから pwd
と変わらないわけですね?
もっと違う使い方があるのかな?
仮想環境のディレクトリー
–venv Output virtualenv information.
--venv
オプションで仮想環境のパスが確認できるみたいです。
$ pipenv --venv
/home/user/.local/share/virtualenvs/myproject-O_i4omMD
仮想環境のパスが出力されました。
終わり
Pipenv を使ってみて、 virtualenv よりもいい印象を受けました。 でも、ディレクトリーの名前を変えたり移動したときに、そのまま使い続けることができないのはやっぱり面倒だと思ってしまいます。