🐍

sys.orig_argvとsys.argvの違い

2022/09/29に公開

sys.orig_argvとsys.argvの違い

Pythonのコマンドライン引数周りについて調べていると、sys.orig_argvという見慣れない属性を見つけました。

公式ドキュメントの説明を見ても、どんなユースケースが想定されていて、sys.argvとの違いはなにか、なぜ3.10になって新しく追加されたのか気になったので調べてみました。

sys.orig_argv

公式ドキュメントには以下のようにありました。(2022-09-29時点)
つまり、sys.orig_argvとは、Python executableに渡されるオリジナルのコマンドライン引数リストとのことです。

sys.orig_argv
The list of the original command line arguments passed to the Python executable.

See also sys.argv.

なるほど。わからなかったのでもう少し詳細に調べてみました。

python -cで使ったPythonパスが取得できない問題

すると、以下のIssueを発見しました。
-cオプションをつけてpythonコマンドを実行すると、sys.argvで実行されたpythonインタプリタが取得できないというものでした。

https://github.com/python/cpython/issues/67615

sys.orig_argvはこの問題に対処するためのものみたいです。

試してみる

Issueの中にあったサンプルを実際に、試してみました。

sys.argv

python -c "import sys; print(sys.argv)" "arg1"
['-c', 'arg1']

sys.orig_argv

python -c "import sys; print(sys.orig_argv)" "arg1"
['/path/to/python/3.10.7/bin/python', '-c', 'import sys; print(sys.orig_argv)', 'arg1']

確かに、sys.argvでは取れなかったpythonのパスがsys.orig_argvでは取れていますね。

まとめ

  • 基本的に、今まで通りsys.argvを使うで問題ない
  • sys.argvsys.orig_argvの違いは、実行されたpythonのパスを含むかどうか
  • どのpythonで実行されたかどうかも含めて、情報を取りたいときはsys.orig_argvを使う

参考

https://github.com/python/cpython/issues/67615

Discussion