趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • Windows10にPython環境を構築

    投稿日 2018年 6月 10日 コメントはありません

    訳あって、Windows10(たまたま32bit版)上でPythonの環境を構築しています。
    で、Python2.7系とPython3系を同時に使いたいのと、Pythonの仮想環境を利用したい(作ったスクリプトを他人に使わせるには必要なパッケージが明確になってないといけない)ので、いろいろ調べながらやってます。

    1.Pythonのインストール

    まず、Python3系をインストーラを使ってインストールします。インストール時には「Add Python to environment variables」のチェックは外しておきます。py.exeに起動するPythonを選ばせるためみたいです。

    次に、Python2系をやはりインストーラを使ってインストールします。インストール時には「Register Extensions」を外します。

    インストールできたかどうかは

    C:\>py -2 -V
    C:\>py -3 -V

    としてそれぞれPython2系、Python3系が起動できているか確認します。

    2.virtualenvのインストール

    Python2系用の仮想環境を作成するvirtualenvをインストールします。

    デフォルトの文字コードがasciiだと失敗するようなので、デフォルトの文字コードを変更します。C:\Python27\Lib\site-packages の下に、sitecustomize.py という名前で以下のファイルを作成します。

    import sys
    sys.setdefaultencoding('cp932')

    作成したら、反映されていることを確認します。

    c:\Python27>py -2
    Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.getdefaultencoding()
    'cp932'
    >>>

    次に、pipをバージョンアップします。

    c:\Python27>py -2 -m pip install --upgrade pip
    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 451kB/s
    Installing collected packages: pip
    Found existing installation: pip 9.0.3
    Uninstalling pip-9.0.3:
    Successfully uninstalled pip-9.0.3
    Successfully installed pip-10.0.1
    
    c:\Python27>

    次に、virtualenvをインストールします

    c:\Python27>py -2 -m pip install virtualenv
    Collecting virtualenv
    Downloading https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c35d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl (1.9MB)
    100% |################################| 1.9MB 2.2MB/s
    Installing collected packages: virtualenv
    The script virtualenv.exe is installed in 'C:\Python27\Scripts' 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 virtualenv-16.0.0
    
    c:\Python27>

    3.virtualenvを使ってみる

    早速Python2.7の仮想環境を作ってみます。

    D:\>mkdir virtual-python
    D:\>cd virtual-python
    D:\virtual-python>py -2 -m virtualenv testenv
    New python executable in D:\virtual-python\testenv\Scripts\python.exe
    :
    :(中略)
    :
    File "D:\virtual-python\testenv\lib\ntpath.py", line 85, in join
    result_path = result_path + p_path
    UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 7: ordinal not in range(128)
    ----------------------------------------
    :
    :(中略)
    :
    OSError: Command D:\virtual-python\testenv\Scripts\python.exe - setuptools pip wheel failed with error code 2
    D:\virtual-python>

    ということで、エラーになってしまいます。で、エラーの原因はまた「UnicodeDecodeError」です。
    原因は、どっかにあるvirtualenv.pyの中で文字コードがascii決め打ちになっているsite.pyを仮想環境の中に展開して、それを使ってしまうために起きているように見えます。
    いろいろやってみると、virtualenvを再実行しても一旦ディレクトリを消したりはしないようですので、これを逆手にとって、一度実行してエラーになってから、sitecustomize.py をコピーしてやるととりあえず最後まで処理が進むようです。
    具体的には、上記の例の場合、エラーになってから、sitecustomize.py をコピーしてきてから再度 virtualenv を起動します。(注:そんなことをしなくてもいい方法がありました・・・後のほうに書いてあります

    D:\virtual-python>copy C:\Python27\Lib\site-packages\sitecustomize.py d:\virtual-python\testenv\Lib\site-packages\.
    1 個のファイルをコピーしました。
    D:\virtual-python>py -2 -m virtualenv testenv
    New python executable in D:\virtual-python\testenv\Scripts\python.exe
    Installing setuptools, pip, wheel...done.

    ということで、旨くいきました。仮想環境への移行も

    D:\virtual-python>cd testenv
    D:\virtual-python\testenv>Scripts\activate.bat
    (testenv) D:\virtual-python\testenv>python -V
    Python 2.7.15
    (testenv) D:\virtual-python\testenv>
    

    でうまくいくようです。
    この上で、scriptsフォルダの下にあるactivate.batを動かして仮想環境に移行後、python2用に作成したスクリプトを動かしてみましたが、無事に動作しました。

    直後に追記)
    こんな回りくどいことをしなくても、–system-site-packages と付ければOKのようです。
    (下記1行目がその例です)

    D:\virtual-python>py -2 -m virtualenv testenv2 --system-site-packages
    New python executable in D:\virtual-python\testenv2\Scripts\python.exe
    Installing setuptools, pip, wheel...done.
    D:\virtual-python>cd testenv2
    D:\virtual-python\testenv2>Scripts\activate.bat
    (testenv2) D:\virtual-python\testenv2>python -V
    Python 2.7.15
    (testenv2) D:\virtual-python\testenv2>python
    Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.getdefaultencoding()
    'cp932'
    >>>

    4.venvを使ってみる

    Python3系用の仮想環境のvenvを使ってみます。こちらはpython3系には標準で入っているので簡単です。使い方はvirtualenvとほぼ同じ。

    D:\>cd virtual-python
    D:\virtual-python>py -3 -m venv testenv3
    D:\virtual-python>cd testenv3
    D:\virtual-python\testenv3>Scripts\activate.bat
    (testenv3) D:\virtual-python\testenv3>python -V
    Python 3.6.5
    (testenv3) D:\virtual-python\testenv3>

    でPython3系が動くことが確認できました。