🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

Q&A

1回答

4243閲覧

【Pycharm / Python / Django】 import文のエラーについて

azuapricot

総合スコア2341

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2019/11/21 02:17

編集2019/11/21 02:41

いつもお世話になっております。

早速本題に入らせていただきます。

現在 Pycharm を使用して Python と Django でWebアプリケーションを開発しているのですが、
タイトルにあります通り、別ディレクトリに置いてあるpythonファイルをimportしようとするとエラーが出てしまいます。

以下が現在の階層構造や、コード、エラー文です。


階層構造

test ∟ test2 __init__.py manage.py ∟ config ∟ main ∟ decorators __init__.py login.py ∟ utils __init__.py config.py  ∟ venv

main/utils/config.py

Python

1from main.decorators.login import login # main と login が赤波線で下記エラー

エラー(警告)文

Unresolved reference 'main' This inspection detects names that should resolve but don't. Due to dynamic dispatch and duck typing. this is possible in a limited but useful number of cases. Top-level and class-level items are supported better than instance items.

試したこと

見たサイトその1
見たサイトその2
PythonでImportErrorが起きたときの確認事項まとめ

  • mainディレクトリに __init__.py ファイルが置いてあるか確認
  • pythonコンソールで以下を入力

python

1>>> import sys 2>>> sys.path 3>>> sys.path.append('/test/test2/main/')

でも↑では解決せず...


これならエラーが出なくなった

Python

1from test2.main.decorators.login import login # mainの一つ上のディレクトリであるtest2から指定 2 3# もしくは 4from .decorators.login import login

結果的に、なぜかtest2から指定すると無事import出来てしまったのですが、
なぜ from main.decorators.login import login ではimportできないのでしょうか・・・。
どこか設定ファイルでの記述が足りないのでしょうか・・・。

お時間ある方で、import方法等についてご存知の方いらっしゃいましたら、ご助力頂けますと幸いです。

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

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

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

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

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

guest

回答1

0

djangoもPycharmも触った事がないのですが、「Source Root」の設定じゃないですか。
ちょっとググってみたら、以下のサイトが見つかりました。

上記を見る限り、「Source Root」が「test」ディレクトリになっていて、「Add source roots to PYTHONPATH」にチェックが入っているとそうなるような気がしますが。

あと、

python

1# もしくは 2from .decorators.login import login

これは、「from ..decorators.login import login」の間違えではないですか。
どちらがあっているかはともかく、基本的にこのような相対importでimportする事をおすすめします。


こちらに関してですが、私もそうじゃないかなと思ったのですが
「from .decorators.login import login」じゃないとエラーが消えないんですよね・・・ウーム

ちょっと考えづらいですね。
絶対importであれば、「PYTHONPATH」を設定するなり、「sys.path」をいじるなり考えられますが、相対importでそのような事はちょっと。
(importのローダを作れば無理やりできなくもなさそうだけど、意味があるとは思えない)

とりあえず、

python

1# もしくは 2from .decorators.login import login 3 4from .decorators import login as login_module 5print('%s, %s' % (repr(__file__), repr(login_module.__file__)))

として、import元・import先のモジュールが想定しているモジュールか、確認されてはいかがですか。

投稿2019/11/21 11:33

編集2019/11/22 12:18
katsuko

総合スコア3536

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

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

azuapricot

2019/11/22 00:34

「from ..decorators.login import login」の間違えではないですか。 こちらに関してですが、私もそうじゃないかなと思ったのですが 「from .decorators.login import login」じゃないとエラーが消えないんですよね・・・ウーム
azuapricot

2019/11/22 00:55

あと回答頂いた方法も試してみましたが、ソースルートに追加→PYTHONPATHの確認→キャッシュの削除と再起動をしてもimport文のエラーは解決しませんでした...
azuapricot

2019/11/25 00:27

重ね重ねありがとうございます... 追記頂いた方法で確認してみましたが、importされているのは想定したモジュールでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問