j3iiifn’s blog

ネットワーク、インフラ、プログラミングについての備忘録

AtCoder, LeetCode, PaizaのPython実行環境を構築する

目的

  • 各オンラインジャッジサイトの実行環境に合わせたローカル開発環境を構築する。
  • 今回はAtCoder, LeetCode, Paizaの3サイトを対象とする。

方針

  • 基本的にpyenvで複数のPythonバージョンをインストール&管理する。
  • ただし後述するように3.4.3だけpyenvでビルドできなかったため、Python公式ページにあるインストーラでインストールする。
  • IntelliJ IDEA CEで各バージョンを使用する。

各サイトのPythonバージョン

環境

  • 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」プラグインを入れる

こちらの記事を参考にPythonプラグインを入れる。

IntelliJでPythonを使用するときの手順

7. オンラインジャッジサイトごとのプロジェクトを作成する

まず、普通にプロジェクトを作成する。

  1. Welcome画面で"Create New Project"を選択する。既に他のプロジェクトを開いている場合は、 File > New > Project
  2. New Project画面が開く。"Next" ボタンで次のページに進む。
  3. "Project name:" に任意の名前を入力し、"Finish"ボタンを押す。

次に、プロジェクトごとに仮想環境を作成する。 プロジェクト作成時にも仮想環境を作成できるが、手動でプロジェクトのディレクトリとvenvディレクトリを作成しなければならないので、ここでやる。 以下の手順を踏むとIntelliJ IDEAに組み込まれたvirtualenvツールが仮想環境を作成する(IntelliJ IDEA 公式ヘルプ)。

  1. File > Project Structure...
  2. "Project Structure"画面が開く。"Project SDK:" の下の "New..." ボタンを押し、"Python SDK" をクリックする。
  3. "Add Python Interpreter"画面が開く。左ペインで"Vitualenv Environment"を選択する。
  4. "New environment"を選択し、各パラメータを以下のようにする。
    • Location: /Users/{YOUR_NAME}/IdeaProjects/{PROJECT_NAME}/venv (デフォルトでこうなっているはず)
    • Base interpreter:
      • AtCoder: /Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4
      • LeetCode: /Users/{YOUR_NAME}/.pyenv/versions/3.8.1/bin/python3.8
      • Paiza: /Users/{YOUR_NAME}/.pyenv/versions/3.6.8/bin/python3.6
    • Inherit global site-packages: チェックしない
    • Make available to all projects: チェックしない
  5. "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に残っていたのを使用した)。

参考URL