好奇心の横断歩道を創る!

自分の思考をラバーダック・デバッグするためのブログ

WindowsでAnacondaとCのコンパイラでCython使おうとしてエラーが出た。Jupyter Notebookではなくて.pyxファイルでCythonを実行するにはどうしたらいいの?に答えるための記録。

2019/05/17追記

この記事は2019/05/15に、Cythonをコマンドで実行できるようにするために、AnacondaからVisual Studio 2019に移行しようとすることなどが書かれた記事です。その後2日間、Visual Studio 2019を使いこなすため調べたり試行錯誤したりしたものの、Cythonを使えるようになるどころかCのコンパイルもうまくいない現状です。したがって、下に書いてある内容は、致命的に欠陥が含まれている可能性が高く、また、Visual Studio 2019が、素人がひとりで使い方を勉強しようとするには適さない環境だということも言えると思います。ですから、この記事は自分の活動の記録を残すためにこのままここに残しておきますが、ここを読まれる方は以下の内容を参考にしないことをお勧めします。

 

 

 

 

◎この記事がやってることを5行で説明

Pythonの環境をAnacondaで環境を作っていた自分が、Cythonを実行するために試行錯誤した結果、Anacondaの環境ではCythonをPowerShell / Anaconda Prompt / コマンドプロンプトで実行できない*1ことを知る。PowerShellで実行できる環境がどうしても欲しかったので、統合開発環境をAnacondaからVisual Studioに変えた。その行動記録。

 

◎どんな人の役に立ちそうな記事か

この記事を読んで役に立つ可能性があるのは、以下の4つの条件を同時に満たす方 と、間がたってから読み返した時に成長を実感したい自分。


①Windows10、AnacondaでPython環境を作っている。


②CythonをJupyterではなくて.pyxファイルで書きたいと思っている。(Jupyterで書く方法はググれば上位にいくつもヒットします。)


③Jupyter Notebook以外の、Anacondaの開発環境を離れる覚悟がある。したがって、Anaconda promptやSpyderをこよなく愛する人は対象外。(もしかしたら復活できるかもしれないが、自分の勉強不足でわからないのです)


④基本的に、Anacondaは使ったことあるけど、Visual Studioは使ったことない。(って人の目線で書きます。自分がそうなので。)

 

おまけ:上の4つの条件に加えて、

error: Unable to find vcvarsall.bat

ってエラーを食らってるとなおよい。

 

 

 

 

◎自分の都合とか、この記事を書くに至った経緯とか。

この項は読まなくても問題ありません。飛ばしてください。

これまで、PythonをAnacondaでつくった環境で動かしてきました。ただし、ここ最近、Pythonの実行速度の遅さに嫌気がさす出来事があり、Cythonを勉強し始めたのです。そこで、Pythonの高速化とやらをできるよう、Cythonを勉強し始めました。

Cythonの公式ドキュメントの日本語訳に一般的なCのコンパイラMinGWだと書いてあったので、CのコンパイラMinGWを使ってgccを導入し、オライリー書籍の「ハイパフォーマンスPython」に書いてある通りにして、初めてのCython実行しようとしました。すると、エラーが発生しました。

調べてみると、Jupyter Notebookを使ってCythonを実行することはできるようです。しかし、自分はあくまで.pyxファイルを実行できる環境を作りたかったのです。MinGWをconda MinGWに入れ替えたり、Anacondaの仮想環境をいじりまくったりしましたが(具体的に何をしたのか知りたい場合は、この記事の一番下のあたりにある、「追記1」を見てください。試行錯誤の一部を書いています)、Anacondaで.pyxに対応できませんでした。

そこでこの記事に書いてある作業を行いました。さんざん迷いに迷った挙句、合計15時間ほどを費やしてやっとVisual Studioを使えるようになった記録です。本当は、Cythonの実行まで書きたかった。また今度できたら書こうかな。

 

何をしていてエラーが出たのか
PythonはAnacondaで環境を作っていました。

Anaconda環境でCythonを使いたいと思い調べたところ、Cythonを動かすにはCのコンパイラが必要だと知り、Cのコンパイラを調べてMinGW(Anaconda Promptで入れる奴じゃない)をインストールしました。
こうしてつくった、Anaconda + MinGW(のAnaconda Promptでインストールしたとかではないやつ) でCythonを実行しようとしたをした結果、このようなエラーが出たのです。

error: Unable to find vcvarsall.bat

 

 

 

どうしてエラーになるのか

結論から言うと、おそらく、「AnacondaとMinGWは”混ぜるな危険”な開発環境だから」のようです。公式ドキュメントの日本語訳版にWindowsでCythonを使うときのCのコンパイラMinGWが一般的とか書いてあったのに。本家のPython(適切な表現がわからない。condaじゃなくて、pipでパッケージ管理する方のPythonです) ならよくてAnacondaのPythonはダメだったということだと思われます。

 

◎解決するために何をするといいか

ステップ1:あると困るものをアンインストール

最初にMinGWのアンインストールします。(MinGWでなくても、Cのコンパイラは削除します。混ぜるな危険が怖いので。)MinGWにはアンインストーラがついてないので、アンインストールしたいときは、手動でMinGWのフォルダ(自分の場合はC:\MinGWにあった)をまるごと削除し、Pathも消します。 スタート画面にMinGW Installation Manager残る場合は、右クリック→その他→ファイルの場所を開くを選択し、MinGW Installation Managerを削除すればOKです。
つぎに、特に理由がなければ*2Anacondaをアンインストールします。しなくても多分大丈夫ですが。あくまで多分。(詳しいことは、読み進めてください。)自分はアンインストールしました。(Vidual StudioでもJupyter Notebookは使えるようにできます。Anaconda NavigatorやSpyderなどは未確認。)

 

ステップ2:Visual Studioを使ってC/C++Pythonの環境をつくります

 

2-1 なぜ統合開発環境Visual Studioを選ぶのか。

なぜVisual Studioなのかというと、理由は2つです。読みたい方だけ読んでください。飛ばしてもあとで困ることはありません。
・一つ目
https://pyjbooks.github.io/py4science/install_c.html
に書いてあるように、

Windows向けのPython本体(CPython)は、Microsoft社の Visual C++を使ってコンパイルされています。Pythonのバージョンによって、使われている Visual C++のバージョンが異なりますので、そのバージョンに合わせたC/C++コンパイラを用意する必要があります。

だからです。Visual C++はVisuai Studioで使うことができます。(表現が適切ではないかも。)
・二つ目
オライリーの書籍である「Cython Cとの融合によるPythonの高速化」もVidual Studioを推奨しているので。


2-2 ここから、Visual Studioをインストールします
Visual Studio 2019のダウンロードページ↓
https://visualstudio.microsoft.com/ja/downloads/?!%5BPayload%20Too%20Large%5D()%0Arr=https%3A%2F%2Fwww.microsoft.com%2Fja-jp%2Fdev%2Fproducts%2Fcommunity
自分は、無料のコミュニティーのやつを選びました。
インストーラーを起動します。
起動してから、これにあるように、「Python開発」の「Pythonネイティブ開発者ツール」にチェックを入れて、「Python開発」と、「C++によるデスクトップ開発」と、「データサイエンスと分析のアプリケーション」の三つをインストールします。Cのインストールがないじゃないか!って気がするかもですが、CはC++によるデスクトップ開発を入れるだけでいいようです。
Anacondaという文字がどこにも見当たらないことに一抹の不安を覚えつつ、しばらく待ちました。

その後も指示に従って、再起動などもこなして、Visual Studioを使えるようになりました。(誘導に従えば大丈夫だと思います。難しいことは特になかったと記憶。)

以上で、Visual Studioを使えるようになりました。

 

ちなみに、これだけだとJupyter NotebookをVisual Studioで使うことはできないです。(多分)

使いたい場合は、字ばかりの下手糞な説明でよければ、下の「追記2」を参照してください。


ステップ3:新しいプロジェクトを作って、Cythonを実行しました

下の手順で作業しました。

手順1
Visual Studioを開いて、「新しいプロジェクトの作成」を選びます。

 

手順2

検索ボックスにPythonと入力するなどして、Pythonアプリケーションを選びます(ダブルクリックでOK)。

 

手順3

プロジェクト名と保存場所を好きなように入力して、右下の作成ボタンを押します。すると、超高機能そうなテキストエディタが開きます。

 

 

追記1
Anacondaで、Jupyterを使わずにCythonを使う方法が見つからなかったことについて。

Anaconda PromptでCythonを実行したかったので以下のことに挑戦しました。結果的に、できませんでしたが。以下、実際に行った作業の手順を示します。

 

ステップ1

Anacondaに新しい仮想環境Cythonをつくり (Anaconda Navigatorで仮想環境をつくる手順→https://qiita.com/code0327/items/fe22dd1c4ff8c385f7a8)、Cythonと検索して引っかかったすべてのライブラリをインストールします。

ステップ2
その後https://cpp-learning.com/anaconda_cpp/に書いてある通りにしてanaconda MinGWをインストールします。インストールした後でCythonが実行できるようになったかどうか確かめたところ、でませんでした。こんなエラーとともに。
=============================================================
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: setup.py --help [cmd1 cmd2 ...]
   or: setup.py --help-commands
   or: setup.py cmd --help

error: no commands supplied
=============================================================

conda MinGWをインストールするだけではだめなのかもしれませんが、調べてもわかりませんでした。
暫定的な結論はこのようになります。AnacondaでJupyterを使わずに、言い換えると.cや.cppのファイルをAnaconda Promptで実行することはできません。
ついでにC/C++ができるかどうかも確かめたところ、C/C++は使えました。

 

追記2
Visual StudioでJupyter Notebookが使いたい人向け

使えるようになるまでの手順を示します

 

手順1
Visual Studioを開いて、「新しいプロジェクトの作成」を選びます。

 

手順2

検索ボックスにPythonと入力するなどして、Pythonアプリケーションを選びます(ダブルクリックでOK)。

 

手順3

プロジェクト名と保存場所を好きなように入力して、右下の作成ボタンを押します。すると、超高機能そうなテキストエディタが開きます。

 

手順4

そのウィンドウの右上の方に、”Python環境”というとこがあって、その直下に環境を追加ってボタンがあります。これをクリックします。新しいウィンドウがひらきます。

 

手順5

左上の方に”conda環境”というのがあるので、それをクリックし、そこで、conda環境の名前やらパッケージやらパッケージ名やらを好きなように記入します。加えて、”Python環境ウィンドウで表示”にチェックを入れます。その後、右下の作成ボタンをクリックしてしばらく待ちます。待っていると、Python環境に新しく追加されると思います。

 

手順6

追加された環境を選んで、その下の、”概要”と書いてあるところを”パッケージ(conda)”にします。直下に出てきた検索ボックスにJupyterと入力します。「次のコマンドを実行する:conda install jupyter」というのが出てくるので、それをクリックします。しばらく待つと、スタート画面に新しくJupyterが追加されます。

以上。

 

 

 

最後に

愚痴ります。
たった今、「もう二度と統合開発環境で失敗したくないあなたへ」みたいなkindle本があったら、そしてそれが毎年内容がアップデートされるとしたら。2万円までは確実に出すと思います。Webサービスにでもするのが良いかと。

今日はここまで。それではまたいつか。

*1:Jupyter Notebookでならできる

*2:Anacondaを消したくないとか、AnacondaとVisual Studioから入れたAnacondaを使い分けたいとか