nikkie-ftnextの日記

イベントレポートや読書メモを発信

#PyConJP2024 Day1、PEP 723(inline script metadata)は天才!と愛を叫んできました #pyconjp_1

はじめに

1日目お疲れさまでした!nikkieです。

登壇報告エントリです

目次

PEP 723(Inline script metadata)が拓く世界。Pythonスクリプトに必要な仮想環境をツールにおまかせできるんです!

登壇予告

スライド

発表中のツイートまとめ
#pyconjp_1 OR #pyconjp2024 OR #pyconjp until:2024-09-27_16:45:00_JSTみたいな感じで掘り起こしたぞ

このトーク用のSNSアイコン

発表後記

聞きに来てくださった皆さま、ありがとうございました!
廊下や懇親会で感想を伝えてくださった方々、めちゃめちゃ嬉しかったです。ありがとうございます!

トークの司会のスタッフの方(お名前失念)が、inline script metadataやuvを使っていらして、めっちゃいい感じで紹介してくださって最高の発表体験でした。
ありがとうございます!

質問して下さったスミスさん(@s3i7h)、懇親会でもいろいろ教えてくださって、コミュニティでPython開発環境の突っ込んだ話をしたかった私1としてはめちゃめちゃ楽しかったです。
ありがとうございました!

(1) uv run <プロジェクトのscript.py (inline script metadataあり)> はどう実行されるんでしょうね。
コマンドのリファレンスからだとどうにも判然としないような(自然言語特有の曖昧さ)。
https://docs.astral.sh/uv/reference/cli/#uv-run

(略) i.e., uv run file.py is equivalent to uv run python file.py. If the script contains inline dependency metadata, it will be installed into an isolated, ephemeral environment.

When used in a project, the project environment will be created and updated before invoking the command.

When used outside a project, if a virtual environment can be found in the current directory or a parent directory, the command will be run in that environment.

回答時に思い浮かべていたのは、以下のあたりのコードです
https://github.com/astral-sh/uv/blob/0.4.16/crates/uv/src/commands/project/run.rs#L105-L135

let script_interpreter = if let Some(script) = script {
    let (source, python_request) = if let Some(request) = python.as_deref() {
        // (1) Explicit request from user
    } else if let Some(file) = PythonVersionFile::discover(&project_dir, false, false).await? {
        // (2) Request from `.python-version`
    } else {
        // (3) `Requires-Python` in the script
    };
}

宿題をいただいた気持ちです(インプットする者に情報が集まる!)

(2) 別の質問:Pythonスクリプト(実行権限付き)のシバンに指定できるのか。
私はpython script.pyインタプリタに渡して実行することがほとんどなので盲点でした。

PEP 723で見かけた覚えがあり
https://peps.python.org/pep-0723/#rationale

Such tools could be used as shebang lines on non-Windows systems e.g. #!/usr/bin/env hatch run.

動くか検証したり、ソースを覗いたりしてみようかな

(3) Exampleでメタデータは冒頭に書かれていましたが、
https://peps.python.org/pep-0723/#example
位置はどこでもよいですね2

正規表現でパースするときに、最初の行が# /// scriptで始まるパターンではなく、# /// scriptで始まる行を探しているので、スクリプトの中にあれば位置はどこでもよいのだと思います。
ですが、個人的にはPEPの例にならって、また分かりやすいので、一番上に書きたいかなと思います

Pythonスクリプトを使っている皆さん、趣味で使っている方は今日から、業務で使っている方は次の営業日から、uv runhatch runをぜひ使っていきましょう!
自動化スクリプト系の書籍にも採用されるといいな〜(おねがいおねがいおねがいおねがい)

関連エントリ

発表準備の様子がこのブログに残っています

おまけ:発表中のテンションの秘密

先日のPIXIV DEV MEETUPで自作したうちわも相乗効果です!


  1. こういう意見交換をずっとしたかったんですよ
  2. 検証 https://github.com/ftnext/pep723/commit/cc8c43f1149604e8ebc3db3f3b31dc234e7ac68a