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

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

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

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

Q&A

解決済

2回答

23995閲覧

pythonで別ディレクトリのファイルをインポートする方法が分かりません.

binary2

総合スコア24

Python 3.x

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

0グッド

0クリップ

投稿2019/02/01 12:41

編集2019/02/04 04:19

前提・実現したいこと

現在pythonでAフォルダのモジュールをBフォルダで読み込みたいのですが,読み込めません..
python初心者で,いろいろ調べてはみましたが,解決しませんでした..

フォルダ構成
pythonというプロジェクトに以下の構成

  • src

| init.py
| HelloWorld.py

  • tests

| test.py

__init__.py

python

1from . import HelloWorld

HelloWorld

python

1class HelloWorld: 2 def __init__(self, say): 3 self.say = say 4 5 def hello(self): 6 hello = 'Hello' + self.say 7 return hello

test.py

python

1from .src import HelloWorld #ここが分からないです 2 3print(HelloWorld.HelloWorld('hello').hello())

srcフォルダを読み込みたいのですが,全くうまくいきません.

発生している問題・エラーメッセージ

実行方法は
1,anacondaのrootからopen terminalからコマンドラインを起動
2.パスを,c:\python\testsに移動
3.コマンドを,python test.py
と実行しております.

以下のエラーメッセージが表示されます.

ModuleNotFoundError: No module named '__main__.src'; '__main__' is not a package

試したこと

  • 環境変数をプロジェクト直下でPATHを通す.
  • sys.pathを試す.

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

  • python version 3.6.8 :: Anaconda

すみませんが,ご助力お願いします.
以上です.

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

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

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

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

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

quickquip

2019/02/01 13:05

どうやって実行しているのか書かれていない
binary2

2019/02/01 13:17

すみません. 実行方法は 1,anacondaのrootからopen terminalからコマンドラインを起動 2.パスを,c:\python\testsに移動 3.コマンドを,python test.py と実行しております.
KSwordOfHaste

2019/02/02 03:09

ご質問の内容とは関係ないですが質問文中のコード用マークダウン ```言語 の「言語」は「言語の種類」を指定する目的のものであってソースファイルの名前を指定するものではありません。 ```init ```HelloWorld のように書いてはいけません。 ```Python で統一してください。ファイル名はコードタグの外側にバッククォート一つで囲んで `__init__.py` ```python from . import HelloWorld ``` のように書くのがよいでしょう。質問文の記述法が不適切なので編集して訂正していただけますか?
binary2

2019/02/04 04:07

KSwordOfHasteさんありがとうございます。修正します。
guest

回答2

0

ベストアンサー

ハッキリ言って、pythonのimportシステムは難しいです。
特に相対importに関して、「importするモジュールを相対パスで指定するもの」と理解していると大抵ドツボにはまります。(しかし、これを完全に間違いだと言えないところが、難しくなっている要点なんですが)

結論だけ言っておきます。

個人的にベストだと思う解決法

ディレクトリ構成を、以下のようにします。

* test.py * src/ - __init__.py - HelloWorld.py

test.pyの内容は、以下のようにします。

python

1# test.py 2 3# from .src import HelloWorld #ここが分からないです 4from src import HelloWorld 5 6 7print(HelloWorld.HelloWorld('hello').hello())

概念的には、

  • 最初に走るスクリプト(一般的に「__main__モジュール」と呼ばれています。)と同じディレクトリにサブディレクトリを作成し、他のスクリプトはその下に置く。
  • __main__モジュールから他のスクリプトをimportする場合には、相対importを使わない。
  • 他のスクリプト同士をimportする場合には、必ず相対importを使う。

ディレクトリ構成をどーーーーーーーーーーーしても変えたくない場合の解決法

tests/test.pyを以下のようにします。

python

1# test.py 2 3import sys, os 4sys.path += [os.path.dirname(os.path.dirname(__file__))] 5 6# from .src import HelloWorld #ここが分からないです 7from src import HelloWorld 8 9 10print(HelloWorld.HelloWorld('hello').hello())

個人的には、sys.pathをいじるのはちゃんとimportシステムを理解してからにすべき、理解していても他に手段があるのであればやめておくべきと思ってます。

投稿2019/02/02 03:06

編集2019/02/02 03:08
katsuko

総合スコア3471

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

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

binary2

2019/02/04 04:16

分かりやすい回答ありがとうございます。解決できました。 ご指摘の通り、importの認識がダメでした、、 まず、ちゃんとimportシステムを理解します。
guest

0

こんにちは。

残念ながら、Pythonでは実行したスクリプトより上の階層へは相対参照できません。

参考:Pythonでディレクトリの上層にあるモジュールをimportするときの注意点 - 長時間睡眠記

投稿2019/02/02 02:42

編集2019/02/02 02:44
firedfly

総合スコア1131

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

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

binary2

2019/02/04 04:17

参考のパスありがとうございます。大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問