96663


# 概要

Wsl on Ubuntuにpyenvを導入しています。

READMEには、"Optionally, try to compile a dynamic Bash extension to speed up
Pyenv.  
Don't worry if it fails; Pyenv will still work normally:"として`cd ~/.pyenv &&
src/configure && make -C src`とありますが、zshを使っている場合にもこれを実行しても構わないんでしょうか。

# 付記

## pyenv

<https://github.com/pyenv/pyenv#basic-github-checkout>

## zsh

zsh 5.8.1 (x86_64-ubuntu-linux-gnu)

## wsl on ubuntu

PRETTY_NAME="Ubuntu 22.04.3 LTS"  
NAME="Ubuntu"  
VERSION_ID="22.04"  
VERSION="22.04.3 LTS (Jammy Jellyfish)"  
VERSION_CODENAME=jammy  
ID=ubuntu  
ID_LIKE=debian  
HOME_URL="https://www.ubuntu.com/"  
SUPPORT_URL="https://help.ubuntu.com/"  
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"  
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-
policy"  
UBUNTU_CODENAME=jammy

WSL バージョン: 1.2.5.0  
カーネル バージョン: 5.15.90.1  
WSLg バージョン: 1.0.51  
MSRDC バージョン: 1.2.3770  
Direct3D バージョン: 1.608.2-61064218  
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp  
Windows バージョン: 10.0.22621.2506


CC BY-SA 4.0
2023-11-03T08:43:43.783
96661
2023-11-03T11:08:10.230
53242
question
python ubuntu zsh pyenv compiler
pyenvのコンパイルによる高速化はzshでも行ってよいのか


そういう時はソースコードを見ましょう（"Use the Soruce,
Luke"）。闇雲に探しても見つけられませんが、blameを使って該当行がどういう経緯で書かれたかを調べると簡単に見つかります。

<https://github.com/pyenv/pyenv/blame/master/README.md#L257>

  1. [Simplify init scheme; update & clarify the README](https://github.com/pyenv/pyenv/commit/8439f8e18714c2aec0399e9cea022467dc4511ff)（書式が更新されただけなので違う）
  2. 更に遡ると[Update install instructions for Bash and Zsh (#1920)](https://github.com/pyenv/pyenv/commit/0d07cda96995abef9dbebb2d1576f2ea40d82338)

コミットメッセージだけでもzshも考慮されている印象を受けますが、念のため [Update install instructions for Bash
and Zsh #1920](https://github.com/pyenv/pyenv/pull/1920)
も読んで納得できれば、zshで使えばよいかと思います。


CC BY-SA 4.0
2023-11-03T09:19:06.150
96662
2023-11-03T09:19:06.150
4236
96661
answer

[code]

    cd ~/.pyenv && src/configure && make -C src
    
[/code]

この処理の実行で何が起こるかと言うと、`~/.pyenv/libexec/pyenv-realpath.dylib` というファイルが生成されます。これは
bash の `enable` コマンド(built-in command) で読み込む shared object です。

[code]

    $ cd ~/.pyenv && src/configure && make -C src
    make: Entering directory '/home/nemo/.pyenv/src'
    gcc -fPIC     -c -o realpath.o realpath.c
    gcc -shared -Wl,-soname,../libexec/pyenv-realpath.dylib  -o ../libexec/pyenv-realpath.dylib realpath.o 
    make: Leaving directory '/home/nemo/.pyenv/src'
    
[/code]

[pyenv/src/realpath.c at master ·
pyenv/pyenv](https://github.com/pyenv/pyenv/blob/master/src/realpath.c#L30)

[code]

    char *realpath_doc[] = {
        "Display each PATHNAME argument, resolving symbolic links. The exit status",
        "is 0 if each PATHNAME was resolved; non-zero otherwise.",
        (char *)NULL
    };
    
[/code]

`pyenv` スクリプト( **bash スクリプト** )内で、この shared object
をロードしています。ロードに失敗した場合は、外部コマンドの `readlink` が使われることになります。(`readlink`
コマンドがインストールされていない、もしくは環境変数 PATH に設定されているディレクトリに存在しない場合は `pyenv` スクリプト自体が終了)

[pyenv/libexec/pyenv at master ·
pyenv/pyenv](https://github.com/pyenv/pyenv/blob/master/libexec/pyenv#L23)

[code]

    if enable -f "${BASH_SOURCE%/*}"/../libexec/pyenv-realpath.dylib realpath 2>/dev/null; then
      abs_dirname() {
        local path
        path="$(realpath "$1")"
        echo "${path%/*}"
      }
    else
      [ -z "$PYENV_NATIVE_EXT" ] || abort "failed to load \`realpath' builtin"
    
      READLINK=$(type -P readlink)
      [ -n "$READLINK" ] || abort "cannot find readlink - are you missing GNU coreutils?"
    
               :
    
[/code]

したがって、`zsh` を使っていても問題ありません。(というより、ログインシェルは無関係です)


CC BY-SA 4.0
2023-11-03T10:34:02.073
96663
2023-11-03T11:08:10.230
2023-11-03T11:08:10.230
47127
47127
96661
answer