ヴェズルフェルニルの研究ノート

座右の銘「ただ一人犀の角のように歩め」的な研究活動ノート

【Homebrew】アップグレード時に "missing xcrun" エラー

Homebrewをアップグレードしようとしたら、下のようなエラーが起きて、できない現象に遭遇した。

% brew upgrade
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

Homebrewの状態を確認すると、下のようになっていた。

% brew config
HOMEBREW_VERSION: >=2.5.0 (shallow or no git repository)
ORIGIN: (none)
HEAD: (none)
Last commit: never
Core tap ORIGIN: https://github.com/Homebrew/homebrew-core
Core tap HEAD: (none)
Core tap last commit: never
Core tap branch: (none)
HOMEBREW_PREFIX: /Users/LOGINNAME/homebrew
HOMEBREW_REPOSITORY: /Users/LOGINNAME/homebrew
HOMEBREW_CELLAR: /Users/LOGINNAME/homebrew/Cellar
HOMEBREW_CASK_OPTS: []
HOMEBREW_DISPLAY: /private/tmp/com.apple.launchd.1YkqUDCCsg/org.xquartz:0
HOMEBREW_EDITOR: vim
HOMEBREW_MAKE_JOBS: 24
HOMEBREW_NO_AUTO_UPDATE: set
Homebrew Ruby: 2.6.8 => /Users/LOGINNAME/homebrew/Library/Homebrew/vendor/portable-ruby/2.6.8_1/bin/ruby
CPU: 24-core 64-bit ivybridge
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Clang: N/A
Git: N/A
Curl: 8.4.0 => /usr/bin/curl
macOS: 12.7.4-x86_64
CLT: N/A
Xcode: 14.2 => /Applications/Xcode-14.2.0.app/Contents/Developer% brew doctor

Homebrew環境でCommand Line Toolsが見つからなくなっているのが原因のようだ。

下のコマンドによってCommand Line Toolsを再インストールしたら、この問題を解決できた。

% xcode-select --install
% brew config
HOMEBREW_VERSION: 3.6.10
ORIGIN: https://github.com/Homebrew/brew
HEAD: eaf887656ffb8e9e35ccf08081814d4735637564
Last commit: 1 year, 5 months ago
Core tap ORIGIN: https://github.com/Homebrew/homebrew-core
Core tap HEAD: 522d42deab7e61f770e75b03661e53ba08d5aca0
Core tap last commit: 1 year, 5 months ago
Core tap branch: master
HOMEBREW_PREFIX: /Users/LOGINNAME/homebrew
HOMEBREW_REPOSITORY: /Users/LOGINNAME/homebrew
HOMEBREW_CELLAR: /Users/yuhri/homebrew/Cellar
HOMEBREW_CASK_OPTS: []
HOMEBREW_DISPLAY: /private/tmp/com.apple.launchd.1YkqUDCCsg/org.xquartz:0
HOMEBREW_EDITOR: vim
HOMEBREW_MAKE_JOBS: 24
HOMEBREW_NO_AUTO_UPDATE: set
Homebrew Ruby: 2.6.8 => /Users/LOGINNAME/homebrew/Library/Homebrew/vendor/portable-ruby/2.6.8_1/bin/ruby
CPU: 24-core 64-bit ivybridge
Clang: 14.0.0 build 1400
Git: 2.37.1 => /Library/Developer/CommandLineTools/usr/bin/git
Curl: 8.4.0 => /usr/bin/curl
macOS: 12.7.4-x86_64
CLT: 14.2.0.0.1.1668646533
Xcode: 14.2 => /Applications/Xcode-14.2.0.app/Contents/Developer

Mac Pro 2013の内蔵SSDを交換するために、Time Machineバックアップと移行アシスタントを使ってシステムを復元したら、このような現象に遭遇してしまった。

Homebrewのアップグレードに限らず、他のコマンドの実行時にも起きることがある現象らしい。また、macOSをアップデートしたりしても起きることがあるそうだ。

【参照リンク】

qiita.com

asdf : 言語バージョン追加時に "No preset version installed for command" エラー

asdfPythonのバージョンを追加インストールしようとしたら、下のようなエラーが起きて、できない状況に遭遇した。

% asdf install python 3.12.3
python-build 3.12.3 /Users/LOGINNAME/.asdf/installs/python/3.12.3
python-build: use openssl@3 from homebrew
python-build: use readline from homebrew
Downloading Python-3.12.3.tar.xz...
-> https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tar.xz
Installing Python-3.12.3...
python-build: use tcl-tk from homebrew
python-build: use readline from homebrew
python-build: use ncurses from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 13.4.1 using python-build 2.4.0-2-ge1f07da7)

Inspect or clean up the working tree at /var/folders/4c/wcry6r391s5cxyc66bnktgf80000gn/T/python-build.20240412084452.14725
Results logged to /var/folders/4c/wcry6r391s5cxyc66bnktgf80000gn/T/python-build.20240412084452.14725.log

Last 10 log lines:
python anaconda3-2023.09-0
make: *** [Modules/_hacl/libHacl_Hash_SHA2.a] Error 126
No preset version installed for command ar
Please install a version by running one of the following:

asdf install python 3.8.18

or add one of the following versions in your config file at 
python anaconda3-2023.09-0
make: *** [Modules/expat/libexpat.a] Error 126

ちなみに、このときのasdfpythonプラグインの状態は以下のようになっている。

% asdf list python
  3.10.12
  3.10.8
  3.11.4
  3.12.2
  3.6.15
  3.8.10
  3.8.17
 *3.8.18
  3.9.17
  3.9.18
  anaconda3-2023.09-0
  miniconda3-3.11-23.10.0-1
  miniconda3-3.8-23.10.0-1
% cat ~/.tool-versions
python 3.8.18
nodejs 18.18.0
golang 1.20.8

Pythonバージョンの3.8.18anaconda3-2023.09-0もインストール済みなのに、「どちらかをインストールせよ」と矛盾したことを言ってくる。

エラーメッセージ内の "No preset version installed for command" で指摘してされているarコマンドの中身を確認すると、下のようになっていた。

% cat ~/.asdf/shims/ar
#!/usr/bin/env bash
# asdf-plugin: python anaconda3-2023.09-0
exec /usr/local/opt/asdf/libexec/bin/asdf exec "ar" "$@" # asdf_allow: ' asdf '

多分これが下のようになっていないといけないんじゃないかと想像して、arコマンドの内容を変更して、Pythonバージョンの追加を再度試みてみた。

% vi ~/.asdf/shims/ar
-# asdf-plugin: python anaconda3-2023.09-0
+# asdf-plugin: python 3.8.18
% asdf reshim
% asdf install python 3.12.3
python-build 3.12.3 /Users/LOGINNAME/.asdf/installs/python/3.12.3
python-build: use openssl@3 from homebrew
python-build: use readline from homebrew
Downloading Python-3.12.3.tar.xz...
-> https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tar.xz
Installing Python-3.12.3...
python-build: use tcl-tk from homebrew
python-build: use readline from homebrew
python-build: use ncurses from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 13.4.1 using python-build 2.4.0-2-ge1f07da7)

Inspect or clean up the working tree at /var/folders/4c/wcry6r391s5cxyc66bnktgf80000gn/T/python-build.20240412090619.17267
Results logged to /var/folders/4c/wcry6r391s5cxyc66bnktgf80000gn/T/python-build.20240412090619.17267.log

Last 10 log lines:
ld: warning: directory not found for option '-L/Users/LOGINNAME/.asdf/installs/python/3.12.3/lib'
ld: warning: directory not found for option '-L/Users/LOGINNAME/.asdf/installs/python/3.12.3/lib'
ld: warning: directory not found for option '-L/Users/LOGINNAME/.asdf/installs/python/3.12.3/lib'
ld: warning: directory not found for option '-L/Users/LOGINNAME/.asdf/installs/python/3.12.3/lib'
ld: warning: directory not found for option '-L/Users/LOGINNAME/.asdf/installs/python/3.12.3/lib'
ld: warning: directory not found for option '-L/Users/LOGINNAME/.asdf/installs/python/3.12.3/lib'
ld: warning: directory not found for option '-L/Users/LOGINNAME/.asdf/installs/python/3.12.3/lib'
ld: warning: directory not found for option '-L/Users/LOGINNAME/.asdf/installs/python/3.12.3/lib'
ld: warning: directory not found for option '-L/Users/LOGINNAME/.asdf/installs/python/3.12.3/lib'
ld: warning: directory not found for option '-L/Users/LOGINNAME/.asdf/installs/python/3.12.3/lib'

エラーメッセージの内容は変わったが、やはりダメだ。

それなら、最初のエラーメッセージで指摘されているanaconda3-2023.09-0が存在すること自体が悪いのかもしれないと思ったので、これを削除した上で、再度試みてみたら上手く行った。

% asdf uninstall python anaconda3-2023.09-0
% asdf reshim
% asdf install python 3.12.3
python-build 3.12.3 /Users/LOGINNAME/.asdf/installs/python/3.12.3
python-build: use openssl@3 from homebrew
python-build: use readline from homebrew
Downloading Python-3.12.3.tar.xz...
-> https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tar.xz
Installing Python-3.12.3...
python-build: use tcl-tk from homebrew
python-build: use readline from homebrew
python-build: use ncurses from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.12.3 to /Users/LOGINNAME/.asdf/installs/python/3.12.3
asdf: Warn: You have configured asdf to preserve downloaded files (with always_keep_download=yes or --keep-download). But
asdf: Warn: the current plugin (python) does not support that. Downloaded files will not be preserved.

ちなみに、ググって調べてみると、この障害現象はasdfの他の言語プラグインでも発生するらしい。

上のような現象が起きた場合は、エラーメッセージ内で指摘されたプラグインの特定のバージョンを一旦アンインストールすれば解決できるんじゃないだろうか。

なお、anaconda3-2023.09-0が存在しており上のような障害現象が起きている状態で、asdfのflutterプラグインでも下のような不可解な現象に遭遇した。

% asdf plugin add flutter
% asdf list all flutter
No compatible versions available (flutter )

これもanaconda3-2023.09-0をアンインストールしたら解決することができた。

asdfではpythonプラグインのanacondaは使わない方が無難だということを思い知らされた。

【参照リンク】

github.com

【Windows】Visual Studio CodeでのMinGW-W64 GCC環境設定

前記事でMinGW-W64によるWindows上でのGCC開発環境の構築方法について書いたが、小生はほぼすべてのプログラミング言語開発をVisual Studio Codeを使って行っているので、GCCによるC/C++プログラム開発もVSCodeを使いたい。

blog.ketus-ix.work

自分の備忘録として、MinGW-W64のGCCを使ったC/C++プログラム開発をVSCode上で行うための環境設定方法を書いておくことにする。

以降の内容は、前記事の内容にしたがって、MingW-W64およびGCCのインストールと環境設定がすべて完了していることを前提としている。

MinGW-W64 GCCVisual Studio Codeの準備

MinGW-W64 GCCのインストールと確認

MinGW-W64のインストール方法については前記事を参照のこと。

GCCを利用するので、当然ながら、これもインストールしておく必要がある。前記事にも書いたが、MSYS2 MINGW64シェルから以下のコマンドを実行すれば、GCCを含む開発パッケージ一式をインストールできる。

$ pacman -S --needed base-devel mingw-w64-x86_64-toolchain

MinGW-W64とGCCのインストールが終わったら、PowerShellを開いて、以下のコマンドがすべて実行できることを確認しておく。

> gcc --version
> g++ --version
> gdb --version

拡張機能 C/C++ のインストール

VSCodeC/C++プログラムの開発を行う場合、拡張機能 "C/C++" を利用する。

メニュー[Manage (管理)](左下の歯車マーク) > [Extensions (拡張機能)] で開いたバネルの検索ボックスに "C/C++" と入力すると、拡張機能 "C/C++" が表示されるので、それを選んで、[Install (インストール)]を実行するとインストールできる。

GCCC++プロジェクト作成と環境設定

GCCC++プロジェクトの作成

VSCodeGCCを使用するための設定は、C++プログラムのプロジェクト毎に行う必要がある。

まず、GCCを使うC++プログラムのプロジェクトディレクトリを作成する。そして、VSCodeからそのディレクトリを開く。

> mkdir helloworld
> cd helloworld
> code .

VSCodeでプロジェクトディレクトリを開いたら、その中に拡張子.cppの適当な名前のソースファイルを一つ作成しておく。

GCCC++プロジェクトのビルド手順設定

エクスプローラ・パネル内のいずれかのC++ソースファイルを選択している状態で、メニュー[View] > [Command Palette]を実行して(または、Ctrl+Shift+Pをタイプして)、コマンドパレットに "Tasks" と入力する。すると、メニューが表示されるので、その中から "Tasks: Configure Default Build Task" を選び、さらに表示されたメニューから "C/C++: g++.exe build active file" を選択する。

すると、下のような内容のtasks.jsonというファイルが作成される。

  • .vscode/tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe build active file",
            "command": "C:\\msys64\\mingw64\\bin\\g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "compiler: C:\\msys64\\mingw64\\bin\\g++.exe"
        }
    ]
}

これが、VSCode上でGCCC++プログラムのビルドを行う際の手順設定ファイルとなる。

プログラムのソースファイルが一つだけならtasks.jsonはこの内容で問題ないが、ソースファイルが複数だったりコンパイルオプションを変える場合は、この内容を変更する必要がある。tasks.jsonの設定項目の詳細は下のリンクページに掲載されている。

https://code.visualstudio.com/docs/cpp/config-mingw#_understanding-tasksjson

試しに、上のtasks.jsonの内容によってプログラムがビルドできるか確認してみよう。

最初に作成した(拡張子cppの)ソースファイルに適当なC++コードを入力して保存する。そして、エクスプローラ・パネル内でそのファイルを選択している状態で、メイン画面右上のプレイ/デバッグ(虫付き▷)ボタンのメニューから[Run C/C++ File]を実行する。

すると、そのソースファイルがビルドされて、ソースファイルと同名の拡張子.exeの実行ファイルが生成されるだろう。

GCCC++プロジェクトのデバッグ手順設定

エクスプローラ・パネル内のいずれかのC++ソースファイルを選択している状態で、メニュー[View] > [Command Palette]を実行して(または、Ctrl+Shift+Pをタイプして)、コマンドパレットに "C/C++" と入力する。すると、メニューが表示されるので、その中から "C/C++: Add Debug Configuration" を選び、さらに表示されたメニューから "C/C++: g++.exe build and debug active file" を選択する。

すると、下のような内容のlaunch.jsonというファイルが作成される。

  • .vscode/launch.json
{
    "configurations": [
        {
            "name": "C/C++: g++.exe build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\msys64\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++.exe build active file"
        }
    ],
    "version": "2.0.0"
}

これが、VSCode上でGCCC++プログラムのデバッグを行う際の手順設定ファイルとなる。

launch.jsonの設定項目の詳細は下のリンクページに掲載されている。

https://code.visualstudio.com/docs/cpp/config-mingw#_customize-debugging-with-launchjson

試しに、上のlaunch.jsonの内容によってプログラムがデバッグできるか確認してみよう。

エクスプローラ・パネル内のいずれかのC++ソースファイルを選択している状態で、ソースコードの適当な場所にブレークポイントを設定し、メイン画面右上のプレイ/デバッグ(虫付き▷)ボタンのメニューから[Debug C/C++ File]を実行する。

すると、そのソースファイルがデバッグ実行されて、設定したブレークポイントの箇所でプログラムが停止するだろう。

GCCC++プロジェクトの追加設定

メニュー[View] > [Command Palette]を実行して(または、Ctrl+Shift+Pをタイプして)、コマンドパレットに "C/C++" と入力する。すると、メニューが表示されるので、その中から "C/C++ : Edit Configurations (UI)" を選択する。

すると、下のような "IntelliSense Configurations" という名前の画面が表示される。

この画面内の[Add Configuration]ボタンを押して、新しい設定の名前として"GCC"と入力し、さらに、"Compiler path" というドロップダウンメニューから "C:/msys64/mingw64/bin/g++.exe" を選択する。さらに、同画面の下方の "IntelliSense mode" のドロップダウンメニューが "windows-gcc-x64" になっていることを確認する(この選択になっていない場合は、同メニューから "windows-gcc-x64" を選択する)。

上記の変更内容は下のようなc_cpp_properties.jsonというファイルとして保存される。

  • .vscode/c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "C:\\msys64\\mingw64\\bin\\gcc.exe",
            "cStandard": "c17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "windows-gcc-x64"
        },
        {
            "name": "GCC",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "C:/msys64/mingw64/bin/g++.exe",
            "cStandard": "c17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "windows-gcc-x64"
        }
    ],
    "version": 4
}

 

Windows上での開発環境について立て続けに記事を書いてきたが、本記事をもってそれは一旦終了する。

Windowsを使わざるをえない仕事が終わったこともあるが、やはり開発環境としてのWindowsはすごく使い勝手が悪い。長年そうしていたように、今後はWindowsの常用は止めて、プログラムの開発や動作確認などで必要な場合のみを使うことにする。

ほとんどのソフトウェア開発はMacでやるのが一番楽だし、組み込み系開発やプログラム・テストもUbuntu Linuxがあれば大抵は用が足りる。10年位前までWindows用アプリやドライバ開発も仕事としてやっていたので、開発環境として常用していたこともあるが、いまではそういう仕事をするつもりはもうない。現代の開発優先はWeb/モバイル/IoTファーストなので、あえてWindows開発機を使う必要性もない。Windows関連開発技術などのフォローは必要な状況が出てきた場合に試してみるだけで十分だと思う。

【参照リンク】

code.visualstudio.com

qiita.com

【Windows】MinGW-W64によるGCC開発環境の構築

Windows上でのC/C++プログラムの開発にはVisual C++(in Visual Studio)を使うのが一般的だが、これはあくまでWindows完全依存のネイティブ・プログラムを開発するための環境だ。

昔からWindows上にUnix互換環境を構築する試みが行われていて、その集大成的なプロジェクトとして1995年に登場したCygwinというものがある。小生は10年前まで組み込み開発が専門分野だったので、Windows上にCygwin導入してクロスGCCコンパイラをよく使っていたものだ。組み込み屋にとってのCygwinの利用価値はこの一点だけだったので、仮想マシン・ツールの普及、DockerやWSLの登場によって、いまではCygwinを使うことはなくなってしまった。

GCCを使ってWindows用プログラムを開発したい、あるいはUnix/LinuxプログラムをWindowsへ移植したいという要望は昔からあって、それに応える開発環境プロジェクトとしてMinGW-W64(32ビット版MinGWプロジェクトからフォークした64ビット対応版)というのがある。

www.mingw-w64.org

MinGWCygwinからフォークしたプロジェクトだが、Cygwinの成果も吸収して発展し、いまではUnix互換開発環境としてはMinGWの方がメジャーになっている。

開発ブラットホームとしてMacLinuxWindowsを併用するようになり、Linux用プログラムをWindowsへ移植しなければならないケースも出てくるので、Windows機にMinGW-W64を導入した。

ググると同様の記事は多くあるが、自分の備忘録として、MinGW-w64のインストールと環境構築方法を書いておく。

MSYS2のインストール

MinGWプロジェクトの成果物としてMSYS(MSYS2)というのがある。これはBashシェル環境とコマンド群をまとめたもので、MinGW-w64とは別のプロジェクトだが、MinGW-W64とMSYS2を一緒に使うことで、Unixライクな64ビット版Windows用プログラムの開発環境を構築できる。

MSYS2のサイトから、この2つを統合した環境のインストーラを入手することができる(本記事執筆時点での最新版インストーラmsys2-x86_64-20240113.exe)。

www.msys2.org

じつは、MinGW-W64 + MSYS2を導入するのは、むしろこのMSYS2のBashターミナル環境を利用することが優先目的だったりする(MacLinuxのターミナル環境に慣れていると、PowerShellコマンドプロンプトを使うのは苦痛なので。YouTube上でのプログラミング・開発系話題の動画内でWindows環境を利用している場面で、このMinGW-w64 + MSYS2が使われているのを多く観られる。Visual Studio Codeと同様に、いまはこれがWindows利用開発での定番環境となっているようだ)。

インストーラのガイド表示に従って操作すると、MSYS2のデフォルトのインストール先ディレクトリはC:\msys64になる。

また、下の6つのアプリ・アイコンがスタートメニュー内に作成される。

これらのアイコンによって起動する各環境では、その中で使用されるコンパイラ・ツールチェイン、ターゲット・アーキテクチャ、ランタイム・ライブラリの種類が以下のように異なっている。

アブリ・アイコン ツールチェイン格納場所 コンパイラ ターゲットアーキテクチャ ランタイムライブラリ
MSYS2 MSYS /usr gcc x86_64 (Intel 64ビット) cygwin
MSYS2 UCRT64 /ucrt64 gcc x86_64 (Intel 64ビット) ucrt
MSYS2 CLANG64 /clang64 llvm x86_64 (Intel 64ビット) ucrt
MSYS2 CLANGARM64 /clangarm64 llvm aarch64 (ARM 64ビット) ucrt
MSYS2 MINGW32 /mingw32 gcc i686 (Intel 32ビット) msvcrt
MSYS2 MINGW64 /mingw64 gcc x86_64 (Intel 64ビット) msvcrt

LinuxC/C++プログラムはほとんどGCCを使って作成されているので、Linuxプログラムの64ビット版Windowsへの移植に利用するのはMSYS2 MINGW64になる(GCCベースのIntel 64ビット版Windowsプログラムの開発・移植しかやらないなら、これ以外は利用することはないかもしれない)。

MinGW-w64の初期設定

環境変数の設定

MSYS2のインストールが終わったら、システム環境変数に"MSYSTEM"="MINGW64"という設定を作成しておく。

管理者権限でPowerShellを開いて、下のコマンドを実行することで、その設定操作が行える。

> [System.Environment]::SetEnvironmentVariable("MSYSTEM", "MINGW64", "Machine")

さらに、ユーザー環境変数Pathに以下のパスを追加する。

  • C:\msys64\mingw64\bin
  • C:\msys64\usr\local\bin
  • C:\msys64\usr\bin
  • C:\msys64\bin
  • C:\msys64\opt\bin

PowerShellを開いて、以下のコマンドを実行することで、その設定操作が行える。

> $oldpath = [System.Environment]::GetEnvironmentVariable("Path", "User"); $oldpath += ";C:\msys64\mingw64\bin"; [System.Environment]::SetEnvironmentVariable("Path", $oldpath, "User")
> $oldpath = [System.Environment]::GetEnvironmentVariable("Path", "User"); $oldpath += ";C:\msys64\usr\local\bin"; [System.Environment]::SetEnvironmentVariable("Path", $oldpath, "User")
> $oldpath = [System.Environment]::GetEnvironmentVariable("Path", "User"); $oldpath += ";C:\msys64\usr\bin"; [System.Environment]::SetEnvironmentVariable("Path", $oldpath, "User")
> $oldpath = [System.Environment]::GetEnvironmentVariable("Path", "User"); $oldpath += ";C:\msys64\bin"; [System.Environment]::SetEnvironmentVariable("Path", $oldpath, "User")
> $oldpath = [System.Environment]::GetEnvironmentVariable("Path", "User"); $oldpath += ";C:\msys64\opt\bin"; [System.Environment]::SetEnvironmentVariable("Path", $oldpath, "User")

これらの環境変数は、コマンドプロンプトPowerShellなどのMSYS2シェル以外のターミナル環境からMinGW-w64のコマンド群を参照可能にするための設定だ。

パッケージの更新

アプリMSYS2 MINGW64を起動して、開いたシェル画面から下のコマンドを実行する。

$ pacman -Syu

これによって、パッケージデータベース情報、pacmanコマンド、コアパッケージが更新される。

もう一度MSYS2 MINGW64を開いて、下のコマンドを実行する。

$ pacman -Su

これによって、既存の全パッケージが更新される。

ユーザー・ホームディレクトリの変更

MSYS2シェル内でのユーザー・ホームディレクト/home/USERNAMEはパスC:\msys64\home\USERNAMEに割り当てられている。

これはユーザーの好み次第だが、以下のファイルを編集することで、このパスをC:\Users\USERNAMEに変更することができる。

  • C:\msys64\etc\nsswitch.conf(MSYS2シェル内パス/etc/nsswitch.conf
-db_home: cygwin desc
+#db_home: cygwin desc
+db_home: windows

この変更を行った場合は、MSYS2シェルから下のようなコマンドを実行して、すべての設定スクリプトファイルをC:\msys64\home\USERNAMEからC:\Users\USERNAMEへコピーしておくべきだ。

$ cd
$ cp -p /c/msys64/home/USERNAME/.profile /c/msys64/home/USERNAME/.bash_profile /c/msys64/home/USERNAME/.bash_logout /c/msys64/home/USERNAME/.bashrc .

GCCのインストールと動作確認

GCCパッケージのインストール

MSYS2 MINGW64シェルから以下のコマンドを実行すれば、GCCコンパイラおよびその関連パッケージ群をインストールできる。

$ pacman -S base-devel
$ pacman -S mingw-w64-x86_64-toolchain

インストール後、以下の3つのコマンドを実行して、GCCコンパイラが利用できることを確認しておく。

$ gcc --version
$ g++ --version
$ cpp --version

GCCによるコンパイル確認

適当なエディタを使って、以下のようなソース・ファイルを作成する。

#include <stdio.h>
int main() {
    printf("Hello, world!\n");
    printf("sizeof(size_t) = %ld\n", sizeof(size_t));
    return 0;
}

MSYS2 MINGW64シェルを開き、下のコマンドを実行すれば、本ソースがコンパイルされる。

$ gcc hello.c

続いて、下のコマンドを実行すれば、コンパイル生成されたプログラムを実行することができる。

$ ./a.exe
Hello, world!
sizeof(size_t) = 8

【参照リンク】

qiita.com

www.kkaneko.jp

qiita.com

【Windows】pyenv + PoetryによるPython仮想環境構築

前記事でpyenvとpipenvの組み合わせによるPython仮想環境の構築方法を紹介したが、pipenvと並び立つPython用仮想環境ツールとしてPoetryがある。

blog.ketus-ix.work

Python用仮想環境ツールとしてvirtualenv、pipenv、Poetryの3つが広く使われているが、最近の主流はPoetryかもしれない。

python-poetry.org

以前の記事で、UbuntuMacを対象したpyenvとPoetryによるPython仮想環境の構築方法について書いたが、Windowsでも同様の環境を作ることができる。

blog.ketus-ix.work

本記事で、pyenvとPoetryを組み合わせたWindows上でのPython仮想環境の構築方法について紹介する。

なお、以下の内容はpyenv(pyenv-win)がインストール済みであることを前提としている(pyenvのインストール方法については前記事を参照のこと)。

Poetryのインストール

Poetryのインストールは、PowerShellから下のコマンドを実行することで行える。

> (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -

Poetryの公式サイトではpyコマンドを使うようになっているが、pyenv側のpythonコマンドを使っても問題ない。

上のコマンドを実行すると、Poetryの実行ファイル群はディレクト%APPDATA%\pypoetryC:\Users\USERNAME\AppData\Roaming\pypoetry)へインストールされる。

Poetryの環境変数設定

Poetryのインストールが済んだら、ディレクトリパス%APPDATA%\Python\ScriptsC:\Users\USERNAME\AppData\Roaming\Python\Scripts)をユーザー環境変数Pathに追加する。

ユーザー環境変数Pathの編集

PowerShellから下のコマンドを実行すれば、その設定操作が行える。

> $oldpath = [System.Environment]::GetEnvironmentVariable("Path", "User"); $oldpath += ";%APPDATA%\Python\Scripts"; [System.Environment]::SetEnvironmentVariable("Path", $oldpath, "User")

Poetryの実行確認

上記の操作が済んだら、poetryコマンドが実行できることを確認しておく。

> poetry --version
Poetry (version 1.7.1)

Poetryの設定変更

Poetryのvirtualenvs.in-projectという設定を以下のように変更しておく。

> poetry config virtualenvs.in-project true
> poetry config --list
cache-dir = "C:\\Users\\USERNAME\\AppData\\Local\\pypoetry\\Cache"
experimental.system-git-client = false
installer.max-workers = null
installer.modern-installation = true
installer.no-binary = null
installer.parallel = true
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.options.always-copy = false
virtualenvs.options.no-pip = false
virtualenvs.options.no-setuptools = false
virtualenvs.options.system-site-packages = false
virtualenvs.path = "{cache-dir}\\virtualenvs"  # C:\Users\USERNAME\AppData\Local\pypoetry\Cache\virtualenvs
virtualenvs.prefer-active-python = false
virtualenvs.prompt = "{project_name}-py{python_version}"
warnings.export = true

この設定をしておくと、プロジェクトディレクトリ内に.venvというディレクトリが作成され、仮想環境のPythonインタープリタおよびパッケージはその中にインストールされるようになる。

pyenv + Poetryによる仮想環境構築

プロジェクトの作成・初期化

> mkdir PROJECT_DIR
> cd PROJECT_DIR
> pyenv local 3.12.1
> python --version
Python 3.12.1
> poetry init

This command will guide you through creating your pyproject.toml config.

Package name [project_dir]:
Version [0.1.0]:
Description []:
Author [vedfolnir-k9 <vedfolnir@ketus-ix.work>, n to skip]:
License []:
Compatible Python versions [^3.12]:

Would you like to define your main dependencies interactively? (yes/no) [yes] no
Would you like to define your development dependencies interactively? (yes/no) [yes] no
Generated file

[tool.poetry]
name = "project-dir"
version = "0.1.0"
description = ""
authors = ["vedfolnir-k9 <vedfolnir@ketus-ix.work>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.12"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"


Do you confirm generation? (yes/no) [yes]

プロンプトCompatible Python versions [^3.12]:に対する入力は、以下のような意味になる。

  • ^3.12

3.12 ≦ プログラムのPython依存バージョン < 4.0

  • >=3.8,<3.13

3.8 ≦ プログラムのPython依存バージョン ≦ 3.12

仮想環境の初期化

> poetry install
Creating virtualenv project-dir in C:\Users\USERNAME\PROJECT_DIR\.venv
Updating dependencies
Resolving dependencies... (0.1s)

Writing lock file

Installing the current project: project-dir (0.1.0)
The current project could not be installed: [Errno 2] No such file or directory: 'C:\\Users\\USERNAME\\PROJECT_DIR\\README.md'
If you do not want to install the current project use --no-root

"No such file or directory: 'C:\\Users\\USERNAME\\PROJECT_DIR\\README.md'" というエラーが表示されるが、これは無視しても構わない。

このエラーを回避したければ、ファイルpyproject.toml内の以下の行を編集すれば良い。

  • pyproject.toml
-readme = "README.md"
+readme = ""

Poetryでのパッケージ管理

パッケージのインストール

$ poerty add PACKAGE_NAME

パッケージのアンインストール

$ poerty remove PACKAGE_NAME

開発用パッケージのインストール

$ poerty add --dev PACKAGE_NAME

開発用パッケージのアンインストール

$ poerty remove --dev PACKAGE_NAME

PoetryによるPythonプログラム実行

仮想環境によって直接プログラムを実行

> poetry run python PROGRAM.py

仮想環境を起動して、プログラムを実行

> poetry shell
> python PROGRAM.py
~~~~    ~~~~
~~~~    ~~~~
~~~~    ~~~~
~~~~    ~~~~
> exit

【Windows】pyenv + pipenvによるPython仮想環境構築

前記事で公式版PythonとpipenvによるPython仮想環境の構築方法について書いたが、その中では以前のUbunuとMacを対象した記事で紹介したpyenvは使っていなかった。

blog.ketus-ix.work

pyenvにはWindows版が存在しており、これとpipenvを組み合わせると、下の記事で紹介したような複数のバージョンのPython仮想環境を自由に作成できるようになる。

blog.ketus-ix.work

複数のバージョンの公式版Pythonを利用したり、公式版Pythonとpipenvを組みわせる方法よりも柔軟性が高いので、Windows上でのPython仮想環境の構築方法としてはこれがお薦めと言えるだろう(公式版Pythonを使う必要性が特にないなら、初めから、本記事の内容に従ってPython開発環境を構築した方が良いと思う)。

本記事で、その方法について紹介しよう。

pyenv(pyenv-win)のインストール

Windows版pyenvはChocolateyを使ってインストールすることができる(Chocolateyについてはこちらの記事を参照のこと)。

> choco install -y pyenv-win

このコマンドを使うと、pyenv-winの実行ファイル群はフォルダ%HOMEPATH%\.pyenvにインストールされる。

pyenvの環境変数設定

pyenv-winのインストール時にシステム環境変数に下の設定が追加される。

  • PYENV%USERPROFILE%\.pyenv\pyenv-win\

システム環境変数PYENV

同時に以下の2つのパスがユーザー環境変数Pathに追加される。

  • %USERPROFILE%\.pyenv\pyenv-win\bin
  • %USERPROFILE%\.pyenv\pyenv-win\shims

ここで、元から存在しているパス "C:\Users\USERNAMR\AppData\Local\Microsoft\WindowsApps" を上の2つより検索順が後になるように変更しておく。

ユーザー環境変数Pathの編集

この変更を行なう理由は、WindowsにもデフォルトのPythonが含まれており、上のパスの検索順を高くすると、そちらのpythonコマンド(C:\Users\USERNAME\AppData\Local\Microsoft\WindowsApps\python.exe)が優先実行の対象となってしまうからだ。pyenv側のpythonコマンド(%HOMEPATH%\.pyenv\pyenv-win\shims\python)が優先実行されるようするために、この変更が必要となる。

pyenvの実行確認

上記の操作が済んだら、pyenvコマンドが実行できることを確認しておく。

> pyenv --version
pyenv 3.1.1

pyenvによるPythonのインストール

入手可能バージョン情報の更新

pyenvをインストールしたら、最初に下のコマンドを実行しておく。

> pyenv update

これによって、pyenvによって入手可能なPythonのバージョン情報が更新される。

将来新しいバージョンのPythonが追加された場合も、このコマンドによって最新のバージョン情報を取得することができる。

Pythonバージョンのインストール

下のコマンドによって、pyenvによってインストール可能なPythonのバージョン情報を取得できる。

> pyenv install --list
:: [Info] ::  Mirror: https://www.python.org/ftp/python
2.4-win32
2.4.1-win32
2.4.2-win32
2.4.3c1-win32
2.4.3-win32
2.4.4-win32
2.5-win32
2.5
2.5.1-win32
2.5.1
2.5.2-win32
2.5.2
2.5.3c1-win32
2.5.3c1
2.5.3-win32
2.5.3
2.5.4-win32
2.5.4
2.6-win32
2.6
2.6.1-win32
2.6.1
2.6.2c1-win32
2.6.2c1
2.6.2-win32
2.6.2
2.6.3rc1-win32
2.6.3rc1
2.6.3-win32
2.6.3
2.6.4rc1-win32
2.6.4rc1
2.6.4rc2-win32
2.6.4rc2
2.6.4-win32
2.6.4
2.6.5rc1-win32
2.6.5rc1
2.6.5rc2-win32
2.6.5rc2
2.6.5-win32
2.6.5
2.6.6rc1-win32
2.6.6rc1
2.6.6rc2-win32
2.6.6rc2
2.6.6-win32
2.6.6
2.7-win32
2.7
2.7.1rc1-win32
2.7.1rc1
2.7.1-win32
2.7.1
2.7.2rc1-win32
2.7.2rc1
2.7.2-win32
2.7.2
2.7.3rc1-win32
2.7.3rc1
2.7.3rc2-win32
2.7.3rc2
2.7.3-win32
2.7.3
2.7.4rc1-win32
2.7.4rc1
2.7.4-win32
2.7.4
2.7.5-win32
2.7.5
2.7.6rc1-win32
2.7.6rc1
2.7.6-win32
2.7.6
2.7.7rc1-win32
2.7.7rc1
2.7.7-win32
2.7.7
2.7.8-win32
2.7.8
2.7.9rc1-win32
2.7.9rc1
2.7.9-win32
2.7.9
2.7.10rc1-win32
2.7.10rc1
2.7.10-win32
2.7.10
2.7.11rc1-win32
2.7.11rc1
2.7.11-win32
2.7.11
2.7.12rc1-win32
2.7.12rc1
2.7.12-win32
2.7.12
2.7.13rc1-win32
2.7.13rc1
2.7.13-win32
2.7.13
2.7.14rc1-win32
2.7.14rc1
2.7.14-win32
2.7.14
2.7.15rc1-win32
2.7.15rc1
2.7.15-win32
2.7.15
2.7.16rc1-win32
2.7.16rc1
2.7.16-win32
2.7.16
2.7.17rc1-win32
2.7.17rc1
2.7.17-win32
2.7.17
2.7.18rc1-win32
2.7.18rc1
2.7.18-win32
2.7.18
3.0a1-win32
3.0a1
3.0a2
3.0a3-win32
3.0a3
3.0a4-win32
3.0a4
3.0a5-win32
3.0a5
3.0b1-win32
3.0b1
3.0b2-win32
3.0b2
3.0b3-win32
3.0b3
3.0rc1-win32
3.0rc1
3.0rc2-win32
3.0rc2
3.0rc3-win32
3.0rc3
3.0-win32
3.0
3.0.1-win32
3.0.1
3.1-win32
3.1
3.1.1-win32
3.1.1
3.1.2rc1-win32
3.1.2rc1
3.1.2-win32
3.1.2
3.1.3rc1-win32
3.1.3rc1
3.1.3-win32
3.1.3
3.1.4rc1-win32
3.1.4rc1
3.1.4-win32
3.1.4
3.2-win32
3.2
3.2.1-win32
3.2.1
3.2.2-win32
3.2.2
3.2.3-win32
3.2.3
3.2.4-win32
3.2.4
3.2.5-win32
3.2.5
3.3.0-win32
3.3.0
3.3.1-win32
3.3.1
3.3.2-win32
3.3.2
3.3.3-win32
3.3.3
3.3.4rc1-win32
3.3.4rc1
3.3.4-win32
3.3.4
3.3.5rc1-win32
3.3.5rc1
3.3.5rc2-win32
3.3.5rc2
3.3.5-win32
3.3.5
3.4.0a1-win32
3.4.0a1
3.4.0a2-win32
3.4.0a2
3.4.0a3-win32
3.4.0a3
3.4.0a4-win32
3.4.0a4
3.4.0b1-win32
3.4.0b1
3.4.0b2-win32
3.4.0b2
3.4.0b3-win32
3.4.0b3
3.4.0rc1-win32
3.4.0rc1
3.4.0rc2-win32
3.4.0rc2
3.4.0rc3-win32
3.4.0rc3
3.4.0-win32
3.4.0
3.4.1rc1-win32
3.4.1rc1
3.4.1-win32
3.4.1
3.4.2rc1-win32
3.4.2rc1
3.4.2-win32
3.4.2
3.4.3rc1-win32
3.4.3rc1
3.4.3-win32
3.4.3
3.4.4rc1-win32
3.4.4rc1
3.4.4-win32
3.4.4
3.5.0a1-win32
3.5.0a1
3.5.0a2-win32
3.5.0a2
3.5.0a3-win32
3.5.0a3
3.5.0a4-win32
3.5.0a4
3.5.0a5-win32
3.5.0a5
3.5.0b1-win32
3.5.0b1
3.5.0b2-win32
3.5.0b2
3.5.0b3-win32
3.5.0b3
3.5.0b4-win32
3.5.0b4
3.5.0rc1-win32
3.5.0rc1
3.5.0rc2-win32
3.5.0rc2
3.5.0rc3-win32
3.5.0rc3
3.5.0rc4-win32
3.5.0rc4
3.5.0-win32
3.5.0
3.5.1rc1-win32
3.5.1rc1
3.5.1-win32
3.5.1
3.5.2rc1-win32
3.5.2rc1
3.5.2-win32
3.5.2
3.5.3rc1-win32
3.5.3rc1
3.5.3-win32
3.5.3
3.5.4rc1-win32
3.5.4rc1
3.5.4-win32
3.5.4
3.6.0a1-win32
3.6.0a1
3.6.0a2-win32
3.6.0a2
3.6.0a3-win32
3.6.0a3
3.6.0a4-win32
3.6.0a4
3.6.0b1-win32
3.6.0b1
3.6.0b2-win32
3.6.0b2
3.6.0b3-win32
3.6.0b3
3.6.0b4-win32
3.6.0b4
3.6.0rc1-win32
3.6.0rc1
3.6.0rc2-win32
3.6.0rc2
3.6.0-win32
3.6.0
3.6.1rc1-win32
3.6.1rc1
3.6.1-win32
3.6.1
3.6.2rc1-win32
3.6.2rc1
3.6.2rc2-win32
3.6.2rc2
3.6.2-win32
3.6.2
3.6.3rc1-win32
3.6.3rc1
3.6.3-win32
3.6.3
3.6.4rc1-win32
3.6.4rc1
3.6.4-win32
3.6.4
3.6.5rc1-win32
3.6.5rc1
3.6.5-win32
3.6.5
3.6.6rc1-win32
3.6.6rc1
3.6.6-win32
3.6.6
3.6.7rc1-win32
3.6.7rc1
3.6.7rc2-win32
3.6.7rc2
3.6.7-win32
3.6.7
3.6.8rc1-win32
3.6.8rc1
3.6.8-win32
3.6.8
3.7.0a1-win32
3.7.0a1
3.7.0a2-win32
3.7.0a2
3.7.0a3-win32
3.7.0a3
3.7.0a4-win32
3.7.0a4
3.7.0b1-win32
3.7.0b1
3.7.0b2-win32
3.7.0b2
3.7.0b3-win32
3.7.0b3
3.7.0b4-win32
3.7.0b4
3.7.0b5-win32
3.7.0b5
3.7.0rc1-win32
3.7.0rc1
3.7.0-win32
3.7.0
3.7.1rc1-win32
3.7.1rc1
3.7.1rc2-win32
3.7.1rc2
3.7.1-win32
3.7.1
3.7.2rc1-win32
3.7.2rc1
3.7.2-win32
3.7.2
3.7.3rc1-win32
3.7.3rc1
3.7.3-win32
3.7.3
3.7.4rc1-win32
3.7.4rc1
3.7.4rc2-win32
3.7.4rc2
3.7.4-win32
3.7.4
3.7.5rc1-win32
3.7.5rc1
3.7.5-win32
3.7.5
3.7.6rc1-win32
3.7.6rc1
3.7.6-win32
3.7.6
3.7.7rc1-win32
3.7.7rc1
3.7.7-win32
3.7.7
3.7.8rc1-win32
3.7.8rc1
3.7.8-win32
3.7.8
3.7.9-win32
3.7.9
3.8.0a1-win32
3.8.0a1
3.8.0a2-win32
3.8.0a2
3.8.0a3-win32
3.8.0a3
3.8.0a4-win32
3.8.0a4
3.8.0b1-win32
3.8.0b1
3.8.0b2-win32
3.8.0b2
3.8.0b3-win32
3.8.0b3
3.8.0b4-win32
3.8.0b4
3.8.0rc1-win32
3.8.0rc1
3.8.0-win32
3.8.0
3.8.1rc1-win32
3.8.1rc1
3.8.1-win32
3.8.1
3.8.2rc1-win32
3.8.2rc1
3.8.2rc2-win32
3.8.2rc2
3.8.2-win32
3.8.2
3.8.3rc1-win32
3.8.3rc1
3.8.3-win32
3.8.3
3.8.4rc1-win32
3.8.4rc1
3.8.4-win32
3.8.4
3.8.5-win32
3.8.5
3.8.6rc1-win32
3.8.6rc1
3.8.6-win32
3.8.6
3.8.7rc1-win32
3.8.7rc1
3.8.7-win32
3.8.7
3.8.8rc1-win32
3.8.8rc1
3.8.8-win32
3.8.8
3.8.9-win32
3.8.9
3.8.10-win32
3.8.10
3.9.0a1-win32
3.9.0a1
3.9.0a2-win32
3.9.0a2
3.9.0a3-win32
3.9.0a3
3.9.0a4-win32
3.9.0a4
3.9.0a5-win32
3.9.0a5
3.9.0a6-win32
3.9.0a6
3.9.0b1-win32
3.9.0b1
3.9.0b2-win32
3.9.0b2
3.9.0b3-win32
3.9.0b3
3.9.0b4-win32
3.9.0b4
3.9.0b5-win32
3.9.0b5
3.9.0rc1-win32
3.9.0rc1
3.9.0rc2-win32
3.9.0rc2
3.9.0-win32
3.9.0
3.9.1rc1-win32
3.9.1rc1
3.9.1-win32
3.9.1
3.9.2rc1-win32
3.9.2rc1
3.9.2-win32
3.9.2
3.9.3-win32
3.9.3
3.9.4-win32
3.9.4
3.9.5-win32
3.9.5
3.9.6-win32
3.9.6
3.9.7-win32
3.9.7
3.9.8-win32
3.9.8
3.9.9-win32
3.9.9
3.9.10-win32
3.9.10
3.9.11-win32
3.9.11
3.9.12-win32
3.9.12
3.9.13-win32
3.9.13
3.10.0a1-win32
3.10.0a1
3.10.0a2-win32
3.10.0a2
3.10.0a3-win32
3.10.0a3
3.10.0a4-win32
3.10.0a4
3.10.0a5-win32
3.10.0a5
3.10.0a6-win32
3.10.0a6
3.10.0a7-win32
3.10.0a7
3.10.0b1-win32
3.10.0b1
3.10.0b2-win32
3.10.0b2
3.10.0b3-win32
3.10.0b3
3.10.0b4-win32
3.10.0b4
3.10.0rc1-win32
3.10.0rc1
3.10.0rc2-win32
3.10.0rc2
3.10.0-win32
3.10.0
3.10.1-win32
3.10.1
3.10.2-win32
3.10.2
3.10.3-win32
3.10.3
3.10.4-win32
3.10.4
3.10.5-win32
3.10.5
3.10.6-win32
3.10.6
3.10.7-win32
3.10.7
3.10.8-win32
3.10.8
3.10.9-win32
3.10.9
3.10.10-win32
3.10.10
3.10.11-win32
3.10.11
3.11.0a1-win32
3.11.0a1
3.11.0a2-win32
3.11.0a2
3.11.0a3-win32
3.11.0a3
3.11.0a4-win32
3.11.0a4
3.11.0a5-win32
3.11.0a5
3.11.0a6-win32
3.11.0a6
3.11.0a7-win32
3.11.0a7
3.11.0b1-win32
3.11.0b1
3.11.0b2-win32
3.11.0b2
3.11.0b3-win32
3.11.0b3
3.11.0b4-win32
3.11.0b4
3.11.0b5-win32
3.11.0b5
3.11.0rc1-win32
3.11.0rc1
3.11.0rc2-win32
3.11.0rc2
3.11.0-win32
3.11.0
3.11.1-win32
3.11.1
3.11.2-win32
3.11.2
3.11.3-win32
3.11.3
3.11.4-win32
3.11.4
3.11.5-win32
3.11.5
3.11.6-win32
3.11.6
3.11.7-win32
3.11.7
3.12.0a1-win32
3.12.0a1
3.12.0a2-win32
3.12.0a2
3.12.0a3-win32
3.12.0a3
3.12.0a4-win32
3.12.0a4
3.12.0a5-win32
3.12.0a5
3.12.0a6-win32
3.12.0a6
3.12.0a7-win32
3.12.0a7
3.12.0b1-win32
3.12.0b1
3.12.0b2-win32
3.12.0b2
3.12.0b3-win32
3.12.0b3
3.12.0b4-win32
3.12.0b4
3.12.0rc1-win32
3.12.0rc1
3.12.0rc2-win32
3.12.0rc2
3.12.0rc3-win32
3.12.0rc3
3.12.0-win32
3.12.0
3.12.1-win32
3.12.1
3.13.0a1-win32
3.13.0a1
3.13.0a2-win32
3.13.0a2
3.13.0a3-win32
3.13.0a3

使用する予定のバージョンのPythonをあらかじめインストールしておく。

> pyenv install 3.12.1
> pyenv install 3.11.7
> pyenv install 3.10.11
> pyenv install 3.9.13
> pyenv install 3.8.10
> pyenv rehash

後から追加することもできるので、適当なバージョンを一つ選んでインストールしておいても良いだろう。

インストール済みバージョンの表示

pyenvによってインストール済みのPythonのバージョンは、下のコマンドによって確認することができる。

> pyenv versions
  3.10.11
  3.11.7
  3.12.1
  3.8.10
  3.9.13

pyenv上でのpipenvのインストール

pipenvのインストール

> pyenv global 3.12.1
> cd
> python --version
Python 3.12.1
> pip install pipenv

pipenvの環境変数設定

pipenvがインストールができたら、ユーザー環境変数に "PIPENV_VENV_IN_PROJECT" = "true" という設定を作成しておく。

ユーザー環境変数PIPENV_VENV_IN_PROJECTの新規作成

PowerShellから下のコマンドを実行すれば、その設定操作が行える。

> [System.Environment]::SetEnvironmentVariable("PIPENV_VENV_IN_PROJECT", "true", "User")

この設定をしておくと、プロジェクトディレクトリ内に.venvというディレクトリが作成され、仮想環境のPythonインタープリタおよびパッケージはその中にインストールされるようになる。

pyenv+pipenvによる仮想環境作成/削除

仮想環境の作成

> mkdir PROJECT_DIR
> cd PROJECT_DIR
> pyenv local 3.12.1
> python --version
Python 3.12.1
> pipenv --python 3.12.1

仮想環境の削除

> cd PROJECT_DIR
> pipenv --rm

pipenvによるパッケージ管理

パッケージのインストール

> pipenv install PACKAGE_NAME

開発用パッケージのインストール

> pipenv install --dev PACKAGE_NAME

パッケージのアンインストール

> pipenv uninstall PACKAGE_NAME

pipenvによるPythonプログラム実行

仮想環境によって直接プログラムを実行

> pipenv run python PROGRAM.py

仮想環境を起動して、プログラムを実行

> pipenv shell
> python PROGRAM.py
~~~~    ~~~~
~~~~    ~~~~
~~~~    ~~~~
~~~~    ~~~~
> exit

補足説明

すでに公式版Pythonをインストール済みの場合、それとpyenvによってインストールするPythonがバッティングしてしまう。

公式版Pythonをすべてアンインストールするか、pyenv側のPythonが優先されるように調整する必要がある。

公式版Pythonのアンインストール

Chocolateyを使って公式版Pythonをインストールした場合は、下のコマンドによってをアンイストールできる。

> choco uninstall -y python

本記事の内容に従って、pyenvとpipenvによって作成した仮想環境だけを使ってPythonプログラム開発を行うなら、公式版Pythonを利用する必要性はない。

公式版よりpyenv側のPythonを優先する設定

公式版Pythonのインストール時に追加された以下の2つのパスをシステム環境変数Pathから削除して、ユーザー環境変数Pathへ移動追加する。

  • C:\Python312\Scripts\
  • C:\Python312\

その場合、pyenvによって追加された2つのパスより検索順が後になるようにする。

ユーザー環境変数Pathの編集

複数のバージョンの公式版Pythonをインストールしていた場合は、同様のすべてのパスをシステム環境変数Pathから削除して、ユーザー環境変数Pathへ移動追加しておく。

前記事の内容に従って、pipenv用の下のパスをユーザー環境変数Pathへ追加していた場合は、これを削除する。

  • C:\Users\USERNAME\AppData\Roaming\Python\Python312\Scripts

pyenv側のpipコマンドを使ってpipenvをインストールでき、それによって仮想環境を作成できるので、公式版Python側のpipenvは不要となる。

【参照リンク】

qiita.com

【Windows】公式版Python + pipenvによる仮想環境構築

以前の記事にpipenvによる仮想環境の構築方法について書いたが、プラットホームはUbuntuMacを対象としてしか説明していなかった。

blog.ketus-ix.work

Windows上でも公式版Python+pipenvの組み合わせで同様の構築を構築できたので、その方法を紹介する。

以降の内容は、公式版Pythonがインストール済みであることを前提としている。Windowsでの公式版Pythonのインストール方法については下の記事を参照のこと。

blog.ketus-ix.work

pipenvのインストール

pipenvのインストールは、公式版Pythonがインストール済みの状態で、PowerShellまたはコマンドプロンプトから下のコマンドを実行すれば行える。

> pip install --user pipenv
....    ....
....    ....
....    ....
....    ....
Installing collected packages: pipenv
  WARNING: The scripts pipenv-resolver.exe and pipenv.exe are installed in 'C:\Users\USERNAME\AppData\Roaming\Python\Python312\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pipenv-2023.11.17
  

ただし、これだけではpipenvのインストールはできても、"pipenv"コマンドを使える状態にはならない。

"pipenv"コマンドを実行すると、下のようなエラーが表示されるだろう。

> pipenv --version
pipenv : 用語 'pipenv' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されま
せん。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してく
ださい。
発生場所 行:1 文字:1
+ pipenv --version
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (pipenv:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
  

これを解決するには、上のpipenvのインストール時に表示された警告メッセージ中のパス "C:\Users\USERNAME\AppData\Roaming\Python\Python312\Scripts" をユーザー環境変数Pathへ追加すれば良い。

ユーザー環境変数Pathの編集

PowerShellから下のコマンドを実行すれば、その設定操作が行える。

> $oldpath = [System.Environment]::GetEnvironmentVariable("Path", "User"); $oldpath += ";C:\Users\USERNAME\AppData\Roaming\Python\Python312\Scripts"; [System.Environment]::SetEnvironmentVariable("Path", $oldpath, "User")

上の操作を行った後、再度PowerShellまたはコマンドプロンプトを開いて"pipenv"コマンドを実行すれば、同コマンドが正常に使える状態になっているはずだ。

> pipenv --version
pipenv, version 2023.11.17

pipenvの環境変数設定

pipenvがインストールができたら、ユーザー環境変数に "PIPENV_VENV_IN_PROJECT" = "true" という設定を作成しておく。

ユーザー環境変数PIPENV_VENV_IN_PROJECTの新規作成

PowerShellから下のコマンドを実行すれば、その設定操作が行える。

> [System.Environment]::SetEnvironmentVariable("PIPENV_VENV_IN_PROJECT", "true", "User")"

この設定をしておくと、プロジェクトディレクトリ内に.venvというディレクトリが作成され、仮想環境のPythonインタープリタおよびパッケージはその中にインストールされるようになる。

pipenvによる仮想環境作成/削除

仮想環境の作成

新しい仮想環境の作成は、必ずプロジェクト用ディレクトリを作成してから、その中で行うようにする。

> mkdir PROJECT_DIR
> cd PROJECT_DIR
> pipenv install

仮想環境を作成すると、プロジェクトディレクトリ内にPipfilePipfile.lockというファイルが作成され、インストールしたパッケージ情報はこの中に追記されていく。

仮想環境の削除

> cd PROJECT_DIR
> pipenv --rm

pipenvによるパッケージ管理

パッケージのインストール

> pipenv install PACKAGE_NAME

開発用パッケージのインストール

> pipenv install --dev PACKAGE_NAME

パッケージのアンインストール

> pipenv uninstall PACKAGE_NAME

pipenvによるPythonプログラム実行

仮想環境によって直接プログラムを実行

> pipenv run python PROGRAM.py

仮想環境を起動して、プログラムを実行

> pipenv shell
> python PROGRAM.py
~~~~    ~~~~
~~~~    ~~~~
~~~~    ~~~~
~~~~    ~~~~
> exit

【参照リンク】

www.aska-ltd.jp