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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Q&A

解決済

2回答

734閲覧

Python3でのインポートについて

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2017/12/22 06:39

編集2017/12/22 07:06

###前提・実現したいこと
Pythonでモジュール分けしたプログラムを作っています
しかし,ひとつしたのディレクトリにあるプログラムをロードできません
関係ないかもしれませんが,LOAD.pyはシングルトン実装にしてあり,Janomeのロード時間を一括するために作りました
###発生している問題・エラーメッセージ
Main.pyからINPUT/DATABANK/LOAD.pyをインポートしたいが,
Traceback (most recent call last):
File "C:/.../Main.py", line 16, in <module>
START()
File "C:/.../Main.py", line 11, in START
__BOOT_UP()
File "C:/.../Main.py", line 4, in __BOOT_UP
boot=LOAD()
TypeError: 'module' object is not callable

が出てしまう

エラーメッセージ Main.py │ __init__.py │ ├─.idea │ │ .name │ │ AI_SYSTEM.iml │ │ misc.xml │ │ modules.xml │ │ workspace.xml │ │ │ └─inspectionProfiles │ Project_Default.xml │ ├─INPUT │ │ Voice_to_String.py │ │ __init__.py │ │ │ ├─DATABANK │ │ │ artist.py │ │ │ LOAD.py │ │ │ MusicDJ.py │ │ │ wikipedia_Teinei.py │ │ │ __init__.py │ │ │ │ │ └─__pycache__ │ │ LOAD.cpython-36.pyc │ │ __init__.cpython-36.pyc │ │ │ └─__pycache__ │ __init__.cpython-36.pyc │ ├─LOGIC │ COMMNDER.py │ __init__.py │ ├─OUTPUT │ PlayAudio.py │ PRINT.py │ __init__.py │ └─__pycache__

###該当のソースコード

python3.6

1##Main.py 2 3def __BOOT_UP(): 4 from INPUT.DATABANK import LOAD 5 boot=LOAD() 6 7 8def START(): 9 import sys 10 print(sys.path) 11 print("BOOT_START") 12 __BOOT_UP() 13 from LOGIC.COMMNDER import COMMNDER 14 COMMNDER() 15 16if __name__ == "__main__": 17 START() 18

Python3.6

1#LOAD.py 2import threading 3from janome.tokenizer import Tokenizer 4 5class LOAD(): 6 7 _instance=None 8 _lock=threading.Lock() 9 Mecab_instance=None 10 11 def __init__(self): 12 print("ロード完了") 13 14 def __new__(cls): 15 with cls._lock: 16 if cls._instance is None: 17 cls._instance=super().__new__(cls) 18 ##ここからロードゾーン 19 global Mecab_instance 20 Mecab_instance=Tokenizer(mmap=True) 21 22 23 return cls._instance 24 25 def getMecab(self): 26 return Mecab_instance

###試したこと
様々なサイトをみたりしたが,インポート機構がいまいちわからない
参考サイト:https://www.lifewithpython.com/2015/05/python-import.html
Pythonをはじめたばかりなので,わかりやすく説明いただけれたら幸いです
###補足情報(言語/FW/ツール等のバージョンなど)
IDEはPycharmー2017.03,python3.6

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

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

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

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

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

LouiS0616

2017/12/22 06:51

エラーメッセージと実際のコードが合致していないように見えます。全て最新のコードが保存されていますか?
退会済みユーザー

退会済みユーザー

2017/12/22 07:04

すみません すぐに直します
guest

回答2

0

ベストアンサー

LouiS0616さんの回答のとおりですが補足的に。

何がimportされたのか?が分かりづらく混乱していると思いますのでimportしたものをprintしてみることをお勧めします。

なお、以下PEP8にもあるとおり
パッケージとモジュールの名前
クラスの名前
関数の名前

  • パッケージ(ディレクトリ)/モジュール(.py)名と関数名は小文字
  • クラス名はCapWords

で命名することをお勧めします。

以下の確認ソースでは、モジュール、クラス、関数をimportしています。

Python

1def __BOOT_UP(): 2 from INPUT.DATABANK import LOAD # LOADはモジュール 3 print(LOAD) # <module 'INPUT.DATABANK.LOAD' from '~ 4 5 #boot = LOAD() # NG 6 boot = LOAD.LOAD() # OK LOADモジュールのLOADクラス 7 8 from INPUT.DATABANK.LOAD import LOAD # LOAD はクラス 9 print(LOAD) # <class 'INPUT.DATABANK.LOAD.LOAD'> 10 11 boot = LOAD() # OK LOADクラス 12 13def START(): 14 import sys 15 print(sys.path) 16 print("BOOT_START") 17 __BOOT_UP() 18 from LOGIC.COMMNDER import COMMNDER # COMMNDER は関数 19 print(COMMNDER) # <function COMMNDER at 0x~ 20 COMMNDER() # OK 21 22if __name__ == "__main__": 23 START()

投稿2017/12/22 07:36

can110

総合スコア38233

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

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

0

次のどちらかで対処してください。

Python

1from INPUT.DATABANK.LOAD import LOAD 2boot = LOAD()

Python

1from INPUT.DATABANK import LOAD 2boot = LOAD.LOAD()

潜在的には、モジュール名とクラス名の命名が曖昧なことによる悲劇です。

エラーを再現するコード

python

1# hoge.py 2 3import fuga 4fuga()

python

1# fuga.py 2 3class Fuga: 4 pass
Traceback (most recent call last): File "hoge.py", line 2, in <module> fuga() TypeError: 'module' object is not callable

モジュール名はlower_snail_case、クラス名はPascalCaseを使うのが一般的です。
pep8(日本語訳本家)にもそのように規定されています。(たぶんCapWords = PascalCase)

投稿2017/12/22 07:17

編集2017/12/22 07:24
LouiS0616

総合スコア35658

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

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

wakame

2017/12/22 07:28

PyCharmを使っているならばモジュール名、クラス名の書き方はpep8準拠の警告がデフォルトでオンになっているはずなので質問文のコードのように書いてるのなら無視しているか設定をオフにしているんでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問