環境

1
2
3
4
5
6
7
8
$ pyinstaller -v
3.4

$ pyenv version
3.7.0 (set by PYENV_VERSION environment variable)

$ pipenv --version
pipenv, version 2018.7.1

環境づくり

pyenvのインストール時に、PYTHON_CONFIGURE_OPTS="--enable-shared"オプションが必要です

1
2
3
4
5
6
7
// pyenv
$ cd /path/to/project/
$ echo "3.7.0" > .python-version
$ PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install

// pipenv
$ pipenv install pyinstaller

スクリプト作成: hello

1
2
3
4
5
6
7
$ cat test.py

def main():
print("hello")

if __name__ == '__main__':
main()

実行: PyInstaller

実行時に、環境変数 LD_LIBRARY_PATHの設定が必要です

1
$ LD_LIBRARY_PATH=/home/vagrant/.anyenv/envs/pyenv/versions/3.7.0/lib pyinstaller test.py

実行してみる

dist/test/ディレクトリ内に実行ファイルが生成されています

1
2
3
$ cd ./dist/test/
$ ./test
hello

エラー: OSError: Python library not found: libpython3.7.so.1.0, libpython3.7m.so.1.0, libpython3.7mu.so.1.0

環境変数PYTHON_CONFIGURE_OPTSに、--enable-sharedオプションをセットせずにpyenv installしていると発生します。

1
2
3
$ PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install
pyenv: /home/vagrant/.anyenv/envs/pyenv/versions/3.7.0 already exists
continue with installation? (y/N) y

エラー: TypeError: expected str, bytes or os.PathLike object, not NoneType

環境変数LD_LIBRARY_PATHをセットせずに、pyinstallerを実行すると発生します。

1
$ LD_LIBRARY_PATH=/home/vagrant/.anyenv/envs/pyenv/versions/3.7.0/lib pyinstaller test.py

環境変数系は面倒なので、.envやdockerのenvironmentなどに設定しておくとよいかも。