質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4714閲覧

"モジュールのスクリプト動作"でも"パッケージ外からの利用"でもimportを動作させたい

barbaz

総合スコア15

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2019/01/14 02:53

自作のpythonのパッケージにおいて、その内部のモジュール単位での実行と、外部のスクリプトからのパッケージの利用の両方でうまく動作するimportの書き方が知りたいです。

環境

  • Windows10
  • python3.7.0
  • ファイル構成は以下の通り
main.py my_package/ __init__.py mod.py submod.py

以下でそれぞれのファイルについて説明します。

init.py

何も記載していません。

submod.py

submod.pyはsubfncの実装があります。

py

1def subfnc(): 2 print("subfnc called")

mod.py

mod.pyはsubmod.pyを使って処理をします。

py

1from submod import subfnc 2 3def fnc(): 4 print("fnc called") 5 subfnc() 6 7# 単体テスト用 8if __name__ == "__main__": 9 print("do something to test fnc()")

ここでpython .\my_package\mod.pyを実行すると単体テストが実行できます。タイトルの"モジュールのスクリプト動作"とはここを指しています。ここまではOKです。

main.py

main.pyは以下のようにmy_package内のmodをimportして使います。

py

1from my_package.mod import fnc 2 3fnc()

これがmy_packageのパッケージとしての本来の使い方(ここがタイトルの"パッケージ外からの利用")かと思います。ただしpython .\main.pyを実行すると以下のようなエラーが発生します。

ModuleNotFoundError: No module named 'submod'

試したこと

ネットで調べると、python3.3以降では相対パスの明示化が必要とのことなので、mod.pyのimport部分に.を追加しました(下記)。

py

1# "."を追加して".submod"とした 2from .submod import subfnc 3 4def fnc(): 5 print("fnc called") 6 subfnc()

この場合はエラーが発生していたコマンドpython .\main.pyがうまくいきました。ただし今度は単体テストのpython .\my_package\mod.pyでエラーが発生するようになりました。

ModuleNotFoundError: No module named 'main.submod'; 'main' is not a package

調査するとモジュールをスクリプトとして実行するときは-mをつけろという情報もあったので、python -m .\my_package\mod.pyとしましたが、今度は違うエラーとなりました。

Relative module names not supported

そのほかにもsys.path.append()しろ、とか出てきますが、なんだかややこしすぎてもっと簡潔な方法がないものかと思い、この辺りのノウハウなどを教えていただきたいです。

tamago324👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

python -mに指定するのは"ファイルの名前"ではなくて、"Python上のモジュールの名前"なので

python -m .\my_package\mod

で実行するのではなくて

python -m my_package.mod

が正解でした。
カレントディレクトリはmain.pyがあるディレクトリで実行してください。

(その部分以外には、間違った記述/誤解は見あたりません)

投稿2019/01/14 04:01

quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

barbaz

2019/01/14 14:46

なるほど、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問