メモの日々


2024年09月12日(木) [長年日記]

[python] Pythonのモジュールとパッケージ

Pythonの「モジュール」と「パッケージ」という用語の使い分けがよくわからなくなる。

pipでインストールしているものはモジュールなのかパッケージなのか?importしているものはモジュールなのかパッケージなのか?

定義

Pythonの用語集には次のように書かれている。

(モジュール) Python コードの組織単位としてはたらくオブジェクトです。モジュールは任意の Python オブジェクトを含む名前空間を持ちます。モジュールは importing の処理によって Python に読み込まれます。

パッケージ を参照してください。

(パッケージ) サブモジュールや再帰的にサブパッケージを含むことの出来る module のことです。専門的には、パッケージは __path__ 属性を持つ Python オブジェクトです。

regular package と namespace package を参照してください。

パッケージの説明に「__path__ 属性を持つ Python オブジェクトです」とあるけど、英語版には「a package is a Python module with a __path__ attribute.」とある。つまり、

  • __path__ 属性を持つモジュールのことを特別にパッケージと呼ぶ

と考えればよさそう。では、__path__ 属性とは何か?

__path__ 属性

__path__ 属性については次に説明があった。

パッケージの __path__ 属性は、そのサブパッケージのインポート中に使われます。インポート機構の内部では、それは sys.path とほとんど同じように機能します。つまり、インポート中にモジュールを探す場所のリストを提供します。しかし、一般的に __path__ は sys.path よりも制約が強いです。

この説明からわかるのは、__path__ 属性はモジュールのインポート処理に使うためのものだということ。

__path__ 属性の有無を調べてみる。

% python
Python 3.12.6 (main, Sep 12 2024, 17:06:52) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, json
>>> hasattr(os, "__path__")
False
>>> hasattr(json, "__path__")
True
>>>

osモジュールはパッケージではないが、jsonモジュールはパッケージであることがわかる。

配布パッケージとインポートパッケージ

上述したことから、importしているものはモジュールだということになるだろう。

一方、pipでインストールするものはパッケージと呼ばれている気がする。

どうやら、Pythonのパッケージという用語には二種類あると考えるべきなようで、Python Packaging User Guideの次のページで説明がなされていた。

これを読むと、先に調べたPythonのパッケージは詳しくは「インポートパッケージ」であり、pipでインストールするものは「配布パッケージ」であると考えるようだ。

パッケージという言葉はあいまいなので、使い方に注意が必要そう。次の言明は正しいと言えるだろうか。

「NumPyという配布パッケージをインストールすると、numpyというモジュールをインポートできるようになる」


2024年08月15日(木) [長年日記]

[windows] Microsoft製の開発ツールのエラーメッセージを英語にする

Windowsにおいて、開発ツールが出力するエラーメッセージを英語にするにはどうするか。

ツール毎に対応方法は異なるだろうが、Microsoft製の開発ツールに影響しそうな環境変数を2つ知ったのでメモ。

MSBuild は前者の変数によりメッセージの言語が変わる。

c:\>set DOTNET_CLI_UI_LANGUAGE=

c:\>msbuild
MSBuild のバージョン 17.11.2+c078802d4 (.NET Framework)
MSBUILD : error MSB1003: プロジェクト ファイルまたはソリューション ファイルを指定してください。現在の作業 ディレクトリはプロジェクト ファイルまたはソリューション ファイルを含んでいません。

c:\>set DOTNET_CLI_UI_LANGUAGE=en-US

c:\>msbuild
MSBuild version 17.11.2+c078802d4 for .NET Framework
MSBUILD : error MSB1003: Specify a project or solution file. The current working directory does not contain a project or solution file.

CL は後者の変数によりメッセージの言語が変わる。ただし、もし英語のメッセージを表示したいならVisual Studioの言語パックとして「英語」をインストールする必要があることに注意(Visual Studio Installerからインストールできる)。

c:\>set VSLANG=

c:\>cl
Microsoft(R) C/C++ Optimizing Compiler Version 19.41.34120 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

使い方: cl [ オプション... ] ファイル名... [ /link リンク オプション... ]

c:\>set VSLANG=1033

c:\>cl
Microsoft (R) C/C++ Optimizing Compiler Version 19.41.34120 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

2024年07月22日(月) [長年日記]

[windows][c++] VS2022がgtest.hを見つけられなかった

Visual Studio 2019用のC++プロジェクトをVisual Studio 2022用に更新したら、GoogleTestのヘッダを見つけられなくなってしまった。

error C1083: include ファイルを開けません。'gtest/gtest.h':No such file or directory

というエラーになる。

検索すると次のissueが見つかった。

GoogleTestのNuGetパッケージが古いと発生するという回答が付いており、確かに古かったので更新(1.8.1.4 → 1.8.1.7)したら解決した。

NuGetが関係するというのはなかなか気づかないかなあ。


2024年06月13日(木) [長年日記]

[windows][c++] 不要な.libと.expファイルを作らないようにする

Visual Studio 2022にて、C++のアプリケーションを作るとexeファイルと一緒にlibファイルexpファイルが作られることがある。exeファイルに対してlibやexpは不要と思われるので作りたくない。

現状でリンカーのリファレンスには書かれていないが、/NOIMPLIB と /NOEXP というオプションが使えるようで、Visual Studioからリンカーのコマンドラインの追加のオプションとしてこれらを指定したら作られなくなった。


2024年06月09日(日) [長年日記]

[hard] Pixel 8aを買った

2年程前に買ったPixel 6aからPixel 8aへ乗り換えた。もう1か月くらい使っているが、6aとの違いを感じる点は何もない。あ、ワイアレス充電に対応している所は違うが、ワイアレス充電を使っていない。価格などをメモ。

Pixel 8a は72600円で、6aより2万円くらい高い。

3年半前に買ったPixel 4aを下取りに出して、9800円になった。

ケースはいつものSpigenで、クリアケースに戻してみた。2500円もして今までよりだいぶ高い。保護フィルムは引き続き使わない。