読者です 読者をやめる 読者になる 読者になる

WindowsにPythonのpythonnetパッケージをインストールする

Python

CPythonから.NETにアクセスできるPythonパッケージがないかを探したところ、pythonnet(Python for .NET)がありました。
pythonnet/pythonnet - GitHub

ただ、インストールで少々悩んだため、メモを残しておきます。

 

環境

  • Windows10 x64
  • Python 3.5.1 x86
  • pip 6.1.1
    • 流れの中で、8.1.1へとアップグレード

   

流れ

pythonnetのインストールエラー
# 環境構築
D:\Sandbox>mkdir pythonnet_install
D:\Sandbox>cd pythonnet_install
D:\Sandbox\pythonnet_install>virtualenv -p c:\python35-32\python.exe env
D:\Sandbox\pythonnet_install>env\Scripts\activate

# PyPIからインストール => エラー
(env) D:\Sandbox\pythonnet_install>pip install pythonnet
...
    C:\Users\<user>\AppData\Local\Temp\pip-build-90jhpr0y\pythonnet\packages\UnmanagedExports.1.2.6\tools\RGiesecke.DllExport.targets(42,5): error MSB4062: "RGiesecke.DllExport.MSBuild.DllExportAppDomainIsolatedTask" タスクをアセンブリ C:\Users\<user>\AppData\Local\Temp\pip-build-90jhpr0y\pythonnet\packages\UnmanagedExports.1.2.6\tools\RGiesecke.DllExport.MSBuild.dll から読み込めませんでした。ファイルまたはアセンブリ'Microsoft.Build.Utilities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。 <UsingTask> 宣言が正しいこと、アセンブリとその依存関係が使用可能であること、および Microsoft.Build.Framework.ITask を実装するパブリック クラスがタスクに含まれていることを確認してください。 [C:\Users\<user>\AppData\Local\Temp\pip-build-90jhpr0y\pythonnet\src\clrmodule\clrmodule.csproj]
...
 Failed building wheel for pythonnet

# GitHubからインストール
(env) D:\Sandbox\pythonnet_install>pip install git+https://github.com/pythonnet/pythonnet.git
...
(同じエラー)
...
 Failed building wheel for pythonnet

 
仕方ないのでUnofficial Windows Binaries for Python Extension Packagesから入れようと考えて眺めていたところ、ウェブサイト中に

Use pip version 8 or newer to install the downloaded .whl files.

Python Extension Packages for Windows - Christoph Gohlke

という記述がありました。

手元のpipのバージョンを確認すると、

(env) D:\Sandbox\pythonnet_install>pip list
You are using pip version 6.1.1, however version 8.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
pip (6.1.1)
setuptools (15.0)

と古かったことから、アップグレードすることにしました。

 

pipのアップグレード(失敗編)

pip 6.1.1の警告メッセージは罠です。

表示通りpip install --upgrade pipすると、

# メッセージ通りにやるとアップグレードに失敗する
(env) D:\Sandbox\pythonnet_install>pip install --upgrade pip
...
PermissionError: [WinError 5] アクセスが拒否されました。: 'd:\\sandbox\\pythonnet_install\\env\\scripts\\pip.exe'

# pipはアンインストールされた状態
(env) D:\Sandbox\pythonnet_install>pip list
ImportError: No module named 'pip'

と、pipのアップグレードに失敗し、pip自体もアンインストールされた状態となりました。

 
そのため、easy_installを使ってpipをインストールするはめになりました。

# easy_installで入れる
(env) D:\Sandbox\pythonnet_install>easy_install pip
...
Finished processing dependencies for pip

# 復活
(env) D:\Sandbox\pythonnet_install>pip list
pip (8.1.1)
setuptools (15.0)

 

pipのアップグレード(成功編)

pipのアップグレードは、python -m pip install --upgrade pipとするのが正しいようです。
Windowsでpip install --ugrade pipが失敗する - Qiita

(env) D:\Sandbox\pythonnet_install>python -m pip install --upgrade pip
You are using pip version 6.1.1, however version 8.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting pip
  Using cached pip-8.1.1-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 6.1.1
    Uninstalling pip-6.1.1:
      Successfully uninstalled pip-6.1.1
Successfully installed pip-8.1.1

(env) D:\Sandbox\pythonnet_install>pip list
pip (8.1.1)
setuptools (15.0)

 

pip 8.1.1でpythonnetをインストール

再度、pipでpythonnetをインストールすると、

(env) D:\Sandbox\pythonnet_install>pip install pythonnet
Collecting pythonnet
  Using cached pythonnet-2.1.0-cp35-cp35m-win32.whl
Installing collected packages: pythonnet
Successfully installed pythonnet-2.1.0

エラーが出ることなく、無事に終わりました。