[解決済み】Python 3.3+のパッケージには__init__.pyは必要ないのでしょうか?
2022-03-28 09:36:18
質問
Python 3.5.1を使っています。ここのドキュメントとパッケージのセクションを読みました。 https://docs.python.org/3/tutorial/modules.html#packages
さて、次のような構成になりました。
/home/wujek/Playground/a/b/module.py
module.py
:
class Foo:
def __init__(self):
print('initializing Foo')
では、その間に
/home/wujek/Playground
:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
同様に、今度は home で、superfolder の
Playground
:
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
実は、いろいろなことができるんです。
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
なぜこれがうまくいくのか?私は
__init__.py
ファイル(空のものでも可)を
a
と
b
に対して
module.py
をインポートできるようにするために、Pythonのパスが
Playground
フォルダーに保存されますか?
Python 2.7から変更になったようです。
~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module
と
__init__.py
の両方で
~/Playground/a
と
~/Playground/a/b
を選択すると、正常に動作します。
解決方法は?
Python 3.3+は
暗黙の名前空間パッケージ
を使用せずにパッケージを作成することができます。
__init__.py
ファイルを作成します。
暗黙のうちに名前空間パッケージを許可するということは、そのために必要な
__init__.py
ファイル
を完全に削除することができます。
と、影響を受ける......。
を使った旧来の方法
__init__.py
ファイルは、Python 2のようにまだ動作します。
関連
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み] Python で importlib.import_module を使ってモジュールをインポートする方法
-
[解決済み] __init__.py は何のためにあるのですか?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] Pythonのsite-packagesディレクトリの場所を見つけるにはどうしたらいいですか?
-
[解決済み] Pythonで'super'は何をするのですか?- super().__init__() と明示的なスーパークラス __init__() の違い
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
PythonはWordの読み書きの変更操作を実装している
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] __init__.py は何のためにあるのですか?
-
[解決済み] サブディレクトリからファイルをインポートする?