目的
- 各オンラインジャッジサイトの実行環境に合わせたローカル開発環境を構築する。
- 今回はAtCoder, LeetCode, Paizaの3サイトを対象とする。
方針
- 基本的にpyenvで複数のPythonバージョンをインストール&管理する。
- ただし後述するように3.4.3だけpyenvでビルドできなかったため、Python公式ページにあるインストーラでインストールする。
- IntelliJ IDEA CEで各バージョンを使用する。
各サイトのPythonバージョン
- AtCoder: 3.4.3
- LeetCode: 3.8
- Paiza: 3.6.8
環境
- MacBook Pro (Retina, 13-inch, Early 2015)
- macOS Mojave 10.14.6
- Homebrew 2.2.3
- pyenv 1.2.16 (Homebrewでインストールした)
- OpenSSL 1.1.1d (Homebrewでインストールした)
- IntelliJ IDEA 2019.3.1 (Community Edition)
手順
1. Homebrew, pyenvをインストールする
ググれば記事がたくさん出てくるので割愛する。
2. Python 3.8.1をインストールする
$ pyenv install 3.8.1 python-build: use openssl@1.1 from homebrew python-build: use readline from homebrew Downloading Python-3.8.1.tar.xz... -> https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tar.xz Installing Python-3.8.1... python-build: use readline from homebrew python-build: use zlib from xcode sdk Installed Python-3.8.1 to /Users/YOUR_NAME/.pyenv/versions/3.8.1
3. Python 3.6.8をインストールする
$ pyenv install 3.6.8 python-build: use openssl@1.1 from homebrew python-build: use readline from homebrew Downloading Python-3.6.8.tar.xz... -> https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz Installing Python-3.6.8... python-build: use readline from homebrew python-build: use zlib from xcode sdk Installed Python-3.6.8 to /Users/YOUR_NAME/.pyenv/versions/3.6.8
4. Python 3.4.3をインストールする
結論から言うと、pyenvではなくPython公式サイトにあるインストーラでインストールした。 「Python 3.4.3 - Feb. 25, 2015」の下にある「Download Mac OS X 64-bit/32-bit installer」からインストーラをダウンロードした。
Python Releases for Mac OS X | Python.org
あまり環境を汚したくないのだが、pyenvでビルドできなかったから仕方がない。 ビルド時のエラーについては記事最下部に書いた。
このインストーラが何をしているかは Python の Mac OS X へのインストール方法 | だえうホームページ が詳しい。
実体は /Library/Frameworks/Python.framework/Versions/3.4/
にインストールされ、 /usr/loca/bin/
にシンボリックリンクが作成されていた。
$ ll /usr/local/bin/python* lrwxr-xr-x 1 YOUR_NAME admin 39 1 18 17:58 /usr/local/bin/python-build@ -> ../Cellar/pyenv/1.2.16/bin/python-build lrwxr-xr-x 1 root wheel 69 1 19 14:39 /usr/local/bin/python3@ -> ../../../Library/Frameworks/Python.framework/Versions/3.4/bin/python3 lrwxr-xr-x 1 root wheel 72 1 19 14:39 /usr/local/bin/python3-32@ -> ../../../Library/Frameworks/Python.framework/Versions/3.4/bin/python3-32 lrwxr-xr-x 1 root wheel 76 1 19 14:39 /usr/local/bin/python3-config@ -> ../../../Library/Frameworks/Python.framework/Versions/3.4/bin/python3-config lrwxr-xr-x 1 root wheel 71 1 19 14:39 /usr/local/bin/python3.4@ -> ../../../Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4 lrwxr-xr-x 1 root wheel 74 1 19 14:39 /usr/local/bin/python3.4-32@ -> ../../../Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4-32 lrwxr-xr-x 1 root wheel 78 1 19 14:39 /usr/local/bin/python3.4-config@ -> ../../../Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4-config lrwxr-xr-x 1 root wheel 72 1 19 14:39 /usr/local/bin/python3.4m@ -> ../../../Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4m lrwxr-xr-x 1 root wheel 79 1 19 14:39 /usr/local/bin/python3.4m-config@ -> ../../../Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4m-config $ ls /Library/Frameworks/Python.framework/Versions/3.4/ Headers Python Resources bin include lib share $ ls /Applications/Python\ 3.4/ IDLE.app Icon? License.rtf Python Documentation.html Python Launcher.app ReadMe.rtf Update Shell Profile.command
5. IntelliJ IDEA CEをインストールする
手順は割愛する。
6. IntelliJ IDEA CEに「Python Community Edition」プラグインを入れる
7. オンラインジャッジサイトごとのプロジェクトを作成する
まず、普通にプロジェクトを作成する。
- Welcome画面で"Create New Project"を選択する。既に他のプロジェクトを開いている場合は、 File > New > Project
- New Project画面が開く。"Next" ボタンで次のページに進む。
- "Project name:" に任意の名前を入力し、"Finish"ボタンを押す。
- atcoder, leetcode, paiza
次に、プロジェクトごとに仮想環境を作成する。 プロジェクト作成時にも仮想環境を作成できるが、手動でプロジェクトのディレクトリとvenvディレクトリを作成しなければならないので、ここでやる。 以下の手順を踏むとIntelliJ IDEAに組み込まれたvirtualenvツールが仮想環境を作成する(IntelliJ IDEA 公式ヘルプ)。
- File > Project Structure...
- "Project Structure"画面が開く。"Project SDK:" の下の "New..." ボタンを押し、"Python SDK" をクリックする。
- "Add Python Interpreter"画面が開く。左ペインで"Vitualenv Environment"を選択する。
- "New environment"を選択し、各パラメータを以下のようにする。
- Location: /Users/{YOUR_NAME}/IdeaProjects/{PROJECT_NAME}/venv (デフォルトでこうなっているはず)
- Base interpreter:
- Inherit global site-packages: チェックしない
- Make available to all projects: チェックしない
- "OK" ボタンを押してダイアログを閉じる。
これで各オンラインジャッジサイト用のローカル実行環境を用意できた。
(参考) pyenvでPython 3.4.3をインストールできない
Common build problems · pyenv/pyenv Wiki を参考にCommand Line Toolsをインストールし直したり、環境変数を付け加えたりしてみたが、次のようにビルドが失敗してしまう。
$ CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" \ > LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib" \ > SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk \ > MACOSX_DEPLOYMENT_TARGET=10.14 \ > pyenv install 3.4.3 python-build: use openssl from homebrew python-build: use readline from homebrew Downloading Python-3.4.3.tar.xz... -> https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tar.xz Installing Python-3.4.3... python-build: use readline from homebrew python-build: use zlib from xcode sdk ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib? Please consult to the Wiki page to fix the problem. https://github.com/pyenv/pyenv/wiki/Common-build-problems BUILD FAILED (OS X 10.14.6 using python-build 20180424) Inspect or clean up the working tree at /var/folders/p5/b4ykfwxj2dbdpcq_hs_95pn80000gn/T/python-build.20200119160141.63313 Results logged to /var/folders/p5/b4ykfwxj2dbdpcq_hs_95pn80000gn/T/python-build.20200119160141.63313.log Last 10 log lines: (cd /Users/YOUR_NAME/.pyenv/versions/3.4.3/share/man/man1; ln -s python3.4.1 python3.1) if test "xupgrade" != "xno" ; then \ case upgrade in \ upgrade) ensurepip="--upgrade" ;; \ install|*) ensurepip="" ;; \ esac; \ ./python.exe -E -m ensurepip \ $ensurepip --root=/ ; \ fi Ignoring ensurepip failure: pip 6.0.8 requires SSL/TLS
ログファイルを見ると、_hashlib
モジュールと _ssl
モジュールのビルドに失敗していることがわかる。
(省略) building '_ssl' extension (省略。エラーがたくさん出てくる) /private/var/folders/p5/b4ykfwxj2dbdpcq_hs_95pn80000gn/T/python-build.20200119160141.63313/Python-3.4.3/Modules/_ssl.c:3055:20: error: incomplete definition of type 'struct x509_object_st' switch (obj->type) { ~~~^ /usr/local/opt/openssl@1.1/include/openssl/ossl_typ.h:130:16: note: forward declaration of 'struct x509_object_st' typedef struct x509_object_st X509_OBJECT; ^ fatal error: too many errors emitted, stopping now [-ferror-limit=] 7 warnings and 20 errors generated. building '_hashlib' extension (省略。エラーがたくさん出てくる) Python build finished successfully! The necessary bits to build these optional modules were not found: ossaudiodev spwd To find the necessary bits, look in setup.py in detect_modules() for the module's name. Failed to build these modules: _hashlib _ssl (省略)
調べてみると、Python 3.4.XはOpenSSL 1.1.Xをサポートしていないらしい。 試しにOpenSSL 1.0.2rでもビルドしてみたが、結果は同様だった(1.0.2rは過去の何かの名残でMacに残っていたのを使用した)。