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

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

ただいまの
回答率

91.24%

  • Python 3.x

    2813questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 69

WTH_0655

score 1

前提・実現したいこと

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__

該当のソースコード

##Main.py

def __BOOT_UP():
        from INPUT.DATABANK import LOAD
        boot=LOAD()


def START():
        import sys
        print(sys.path)
        print("BOOT_START")
        __BOOT_UP()
        from LOGIC.COMMNDER import COMMNDER
        COMMNDER()

if __name__ == "__main__":
    START()
#LOAD.py
import threading
from janome.tokenizer import Tokenizer

class LOAD():

    _instance=None
    _lock=threading.Lock()
    Mecab_instance=None

    def __init__(self):
        print("ロード完了")

    def __new__(cls):
        with cls._lock:
            if cls._instance is None:
                cls._instance=super().__new__(cls)
                ##ここからロードゾーン
                global Mecab_instance
                Mecab_instance=Tokenizer(mmap=True)


                return cls._instance

    def getMecab(self):
        return Mecab_instance

試したこと

様々なサイトをみたりしたが,インポート機構がいまいちわからない
参考サイト:https://www.lifewithpython.com/2015/05/python-import.html
Pythonをはじめたばかりなので,わかりやすく説明いただけれたら幸いです

補足情報(言語/FW/ツール等のバージョンなど)

IDEはPycharmー2017.03,python3.6

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • LouiS0616

    2017/12/22 15:51

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

    キャンセル

  • WTH_0655

    2017/12/22 16:04

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

    キャンセル

回答 2

checkベストアンサー

+2

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

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

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

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

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

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

def __BOOT_UP():
        from INPUT.DATABANK import LOAD # LOADはモジュール
        print(LOAD) # <module 'INPUT.DATABANK.LOAD' from '~

        #boot = LOAD()      # NG
        boot = LOAD.LOAD()  # OK LOADモジュールのLOADクラス

        from INPUT.DATABANK.LOAD import LOAD # LOAD はクラス
        print(LOAD)         # <class 'INPUT.DATABANK.LOAD.LOAD'>

        boot = LOAD()       # OK LOADクラス

def START():
        import sys
        print(sys.path)
        print("BOOT_START")
        __BOOT_UP()
        from LOGIC.COMMNDER import COMMNDER # COMMNDER は関数
        print(COMMNDER) # <function COMMNDER at 0x~
        COMMNDER() # OK

if __name__ == "__main__":
    START()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

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

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

エラーを再現するコード

# hoge.py

import fuga
fuga()
# fuga.py

class Fuga:
    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 16:28

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

    キャンセル

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

ただいまの回答率

91.24%

関連した質問

  • 受付中

    MeCab.jarの生成について

    前提・実現したいこと MeCabを使って形態素解析をしようとしています。 発生している問題・エラーメッセージ javaバインディングの際にmakeするあたりが分からずに困

  • 解決済

    Spring Boot MavenでSQLite3に接続したい。

    Spring Boot MavenでSQLite3に接続したいのですが、 STSを使用して「Spring Boot アプリケーション」を起動すると、 以下のエラーが出て起動出来

  • 解決済

    Spring起動→サーバーアクセス反応なし

    ※フォルダ構成です。 springをApplicationのメインメッソッドで実行したのですがhttp://localhost:8080/roomsにアクセスしても404

  • 解決済

    Pythonのthreadingにおける、終了時の処理

    前提・実現したいこと Pythonを使って、動画や画像を表示するGUIを作っています。その中で、みなさまのご支援を頂ながらカメラの画像を取り込んで再生できるところまで来ました。

  • 受付中

    形態素解析の結果の際pydotplus、graphvizの結果が白紙出力

    いつもお世話になっております。質問です。 実現したいこと 以下のコードの実行結果がgraph().jpgで出力されるが、真っ白で出力。 しかし画像サイズはそれぞれ別々のサイズで

  • 解決済

    pythonでMecabを利用した語彙解析がうまくできない。

    ●環境 ・Windows Edition:Windows 7 Professional  Service Pack 1 ・pythonバージョン:Python 3.6.2 (v3.

  • 解決済

    mecab 品詞 選択

    やりたいこと 選択したテキストファイル内の文章をmecabを用いて形態素解析し、 品詞(名詞、動詞など)を絞り込みたいと考えています。 現在、テキストファイルの文章を形態素解析する

  • 解決済

    テキストに番号を付けて管理したい

    困っていること 入力したファイルのトピックを抽出するための前段階として 指定したディレクトリ内の.txtファイルを用いてLDAモデルを作成するプログラムを実装したのですが、 現在の

同じタグがついた質問を見る

  • Python 3.x

    2813questions

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