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が見つかった。
- Issue with GoogleTest project when upgrading to VS2022 (Developer Community)
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からリンカーのコマンドラインの追加のオプションとしてこれらを指定したら作られなくなった。