[python] pipで入れたコマンドを一括でアップデートする

これまで使っていたパッケージが古いバージョンだったので一括でアップデートしようとしたのですが、

```
pip update
```

みたいなコマンドがなかったので、エイリアスを作りました。

便利になったかと言われたら微妙です笑


# 手順

```
$ pip install --upgrade pip
$ cd ~
$ mkdir .pip_update
$ cd .pip_update
$ sudo pip-chill --no-version > ./pip_list.txt
$ sudo chmod 701 pip_list.txt
$ cd ../
$ sudo chmod 701 .pip_update
```

```
$ sudo pip install --upgrade -r ~/.pip_update/pip_list.txt
```

これでやると、初めはエラーが出ました。

どういうエラーかというと、

```
Collecting pydelicious (from -r /Users/username/.pip_update/pip_list.txt (line 106))
  Downloading pydelicious-0.6.1.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/tmp/pip-build-_82vkdci/pydelicious/setup.py", line 11, in <module>
        import pydelicious
      File "/private/tmp/pip-build-_82vkdci/pydelicious/pydelicious/__init__.py", line 171
        raise DeliciousItemExistsError, params['url']
                                      ^
    SyntaxError: invalid syntax
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/tmp/pip-build-_82vkdci/pydelicious/
```


このpydeliciousは以前、集合知プログラミングという本で勉強した時に入れたのですが、サポートが終わっているのかうまく行かなかったのを思い出したので、


```
$ pip uninstall pydelicious
```

でアンインストールしました。


```
Uninstalling pydelicious-0.6:
  /Users/username/anaconda/bin/dlcs
  /Users/username/anaconda/lib/python3.6/site-packages/pydelicious-0.6-py3.6.egg
Proceed (y/n)? y
  Successfully uninstalled pydelicious-0.6
Traceback (most recent call last):
  File "/Users/username/anaconda/bin/pip", line 6, in <module>
    sys.exit(pip.main())
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/__init__.py", line 249, in main
    return command.main(cmd_args)
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/basecommand.py", line 252, in main
    pip_version_check(session)
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/utils/outdated.py", line 102, in pip_version_check
    installed_version = get_installed_version("pip")
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/utils/__init__.py", line 838, in get_installed_version
    working_set = pkg_resources.WorkingSet()
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 644, in __init__
    self.add_entry(entry)
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 700, in add_entry
    for dist in find_distributions(entry, True):
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 1949, in find_eggs_in_zip
    if metadata.has_metadata('PKG-INFO'):
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 1463, in has_metadata
    return self.egg_info and self._has(self._fn(self.egg_info, name))
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 1823, in _has
    return zip_path in self.zipinfo or zip_path in self._index()
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 1703, in zipinfo
    return self._zip_manifests.load(self.loader.archive)
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 1643, in load
    mtime = os.stat(path).st_mtime
FileNotFoundError: [Errno 2] No such file or directory: '/Users/username/anaconda/lib/python3.6/site-packages/pydelicious-0.6-py3.6.egg'
```

というエラーが出ましたが、とりあえず `Successfully uninstalled pydelicious` と書かれていたのでよしとして先に進みました。


インストールしたくないパッケージが出てきたので、 `pip_list.txt` を書き直します。

```
$ sudo pip-chill --no-version > ~/.pip_update/pip_list.txt
```

これで

```
$ pip install --upgrade -r ~/.pip_update/pip_list.txt
```

をすると、

```
Successfully installed Jinja2-2.9.6 MarkupSafe-1.0 PyWavelets-0.5.2 alabaster-0.7.10 alembic-0.9.6 argcomplete-1.9.2 asn1crypto-0.23.0 astroid-1.5.3 astropy-2.0.2 awscli-1.11.178 babel-2.5.1 banal-0.2.1 bcrypt-3.1.4 bleach-2.1.1 bokeh-0.12.10 boto-2.48.0 boto3-1.4.7 botocore-1.7.36 bottleneck-1.2.1 cached-property-1.3.1 cffi-1.11.2 chardet-3.0.4 cloudpickle-0.4.1 contextlib2-0.5.5 cryptography-2.1.2 cython-0.27.2 dataset-1.0.3 decorator-4.1.2 dill-0.2.7.1 docutils-0.14 durationpy-0.5 entrypoints-0.2.3 flask-0.12.2 flask-cors-3.0.3 gevent-1.2.2 greenlet-0.4.12 h5py-2.7.1 hjson-3.0.0 html5lib-1.0b10 idna-2.6 ipykernel-4.6.1 ipython-6.2.1 ipython-genutils-0.2.0 ipywidgets-7.0.3 isodate-0.6.0 isort-4.2.15 jedi-0.11.0 jsonschema-2.6.0 jupyter-client-5.1.0 jupyter-console-5.2.0 jupyter-contrib-nbextensions-0.3.3 jupyter-core-4.3.0 jupyter-highlight-selected-word-0.1.0 jupyter-nbextensions-configurator-0.2.8 jupyterthemes-0.18.2 keras-2.0.8 lazy-object-proxy-1.3.1 llvmlite-0.20.0 lxml-4.1.0 markdown-2.6.9 matplotlib-2.1.0 mccabe-0.6.1 mistune-0.8 mpmath-1.0.0 nbconvert-5.3.1 nbformat-4.4.0 networkx-2.0 nltk-3.2.5 normality-0.5.0 notebook-5.2.0 numba-0.35.0 numexpr-2.6.4 numpy-1.13.3 numpydoc-0.7.0 openpyxl-2.4.9 pandas-0.20.3 pandocfilters-1.4.2 paramiko-2.3.1 parso-0.1.0 partd-0.3.8 pathlib2-2.3.0 pep8-1.7.1 pillow-4.3.0 ply-3.10 prompt-toolkit-1.0.15 protobuf-3.4.0 psutil-5.4.0 ptyprocess-0.5.2 py-1.4.34 pyasn1-0.3.7 pycparser-2.18 pyflakes-1.6.0 pygments-2.2.0 pylint-1.7.4 pyopenssl-17.3.0 pytest-3.2.3 pytimeparse-1.1.7 qtawesome-0.4.4 qtconsole-4.3.1 qtpy-1.3.1 redis-2.10.6 requests-2.18.4 rope-0.10.7 s3transfer-0.1.11 scikit-image-0.13.1 scikit-learn-0.19.1 scipy-1.0.0 selenium-3.6.0 sphinx-1.6.5 sphinxcontrib-websupport-1.0.1 spyder-3.2.4 sqlalchemy-1.1.14 sqlparse-0.2.4 statsmodels-0.8.0 stevedore-1.27.1 sympy-1.1.1 tables-3.4.2 tensorflow-1.3.0 tensorflow-tensorboard-0.1.8 testpath-0.3.1 tornado-4.5.2 tqdm-4.15.0 traitlets-4.3.2 troposphere-2.0.2 urllib3-1.22 virtualenvwrapper-4.8.2 wheel-0.30.0 widgetsnbextension-3.0.6 wrapt-1.10.11 xlrd-1.1.0 xlsxwriter-1.0.2 xlwings-0.11.4 xlwt-1.3.0 zappa-0.44.3
```

となり、うまくインストールできたようです。


しかしここでも2種類のエラーが出ており、

①setup.pyを実行している間に以下のようにでる

```
DEPRECATION: Uninstalling a distutils installed project (cython) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
```

②pip.main()を実行しようとすると以下のエラーがでる

```
Traceback (most recent call last):
  File "/Users/username/anaconda/bin/pip", line 6, in <module>
    sys.exit(pip.main())
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/__init__.py", line 249, in main
    return command.main(cmd_args)
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/basecommand.py", line 252, in main
    pip_version_check(session)
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/utils/outdated.py", line 102, in pip_version_check
    installed_version = get_installed_version("pip")
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/utils/__init__.py", line 838, in get_installed_version
    working_set = pkg_resources.WorkingSet()
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 644, in __init__
    self.add_entry(entry)
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 700, in add_entry
    for dist in find_distributions(entry, True):
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 1949, in find_eggs_in_zip
    if metadata.has_metadata('PKG-INFO'):
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 1463, in has_metadata
    return self.egg_info and self._has(self._fn(self.egg_info, name))
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 1823, in _has
    return zip_path in self.zipinfo or zip_path in self._index()
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 1703, in zipinfo
    return self._zip_manifests.load(self.loader.archive)
  File "/Users/username/anaconda/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 1643, in load
    mtime = os.stat(path).st_mtime
FileNotFoundError: [Errno 2] No such file or directory: '/Users/username/anaconda/lib/python3.6/site-packages/jupyter_highlight_selected_word-0.0.11-py3.6.egg'
```

これはなんなんだろう...

わかる方いたら教えてください。

# エイリアスにする

次回から思い立ったらすぐにアップデートできるように `.zshrc` にエイリアスを作成します。
（僕はzshを使っているので、他のシェルを使っている人は `.bashrc` とかの設定ファイルに同じように追加してください。）

```
$ pip-pkg-update() { sudo pip install --upgrade -r ~/.pip_update/pip_list.txt }
```

これで次から

```
$ pip-pkg-update
```

でアップデートできます。


さっきのエラーはなんだったのか。。。バージョン管理って難しいですね。