同じディレクトリまたはサブディレクトリ内にクラスをインポートするにはどうすればよいですか?


675

すべての.pyファイルを格納するディレクトリがあります。

bin/
   main.py
   user.py # where class User resides
   dir.py # where class Dir resides

私はからのクラスを使用したいuser.pydir.pyをしてmain.py
これらのPythonクラスをmain.pyにインポートするにはどうすればよいですか?
さらに、user.pyがサブディレクトリにあるUser場合、どのようにクラスをインポートできますか?

bin/
    dir.py
    main.py
    usr/
        user.py


回答:


934

Python 2

ファイルと__init__.py同じディレクトリに空のファイルを作成します。これは、「このディレクトリからインポートしてもよい」ことをPythonに示します。

その後、ただ...

from user import User
from dir import Dir

ファイルがサブディレクトリにある場合も同じことが当てはまります。__init__.pyサブディレクトリにもを配置してから、ドット表記の通常のインポートステートメントを使用します。ディレクトリのレベルごとに、インポートパスに追加する必要があります。

bin/
    main.py
    classes/
        user.py
        dir.py

したがって、ディレクトリの名前が「classes」の場合は、次のようにします。

from classes.user import User
from classes.dir import Dir

Python 3

前と同じですが.、サブディレクトリを使用しない場合は、モジュール名の前にaを付けます。

from .user import User
from .dir import Dir

14
__init__.pyが空でない場合は__init__.py、パッケージをインポートしたときに何が利用できるかがわかります(インポートされていないもの__init__.pyはまったく利用できません)。
アンバー

23
なぜ__init__.pyファイルが必要なのですか?3つのファイルすべてを同じディレクトリに配置してを実行するmain.pyimport、他の2つのモジュールからそれなしで問題なく実行できます。何が欠けていますか?
martineau 2013

30
それは、Pythonがインポートを許可されているディレクトリを特定する方法だからです。実行しているスクリプトのディレクトリは例外です-そこからのインポートは常に許可されています。
アンバー

20
@nbro&Amber:FWIW、__init__.py同じディレクトリに他のモジュールをインポートできること、およびインポートできることに関して、微妙な変更があったと思います。具体的には、Python 2.7.8で機能していimport__init__.pyファイル自体と同じディレクトリにある他のモジュールが、Python 3.4.1では失敗しました。これを修正するには、サブディレクトリの名前とドットをそれぞれの前に付ける必要がありました(つまりimport module、に変更する必要がありましたimport subdirectory.module)。幸いなことに、これを行った後でもPython 2.7.8で動作しました。
martineau 14

4
このソリューションが機能していないことを確認できます。それを訂正、修正、または完全に削除したい場合があります。
ルイス・デ・スーザ

137

martineauのコメントのおかげで)同じディレクトリ内のファイルからクラスをインポートするには、Python 3で記述することを学びました。

from .user import User
from .dir import Dir

7
私がこれを試した場合、次のエラーValueError: Attempted relative import in non-packageが発生しますが、変更するとエラーが消えますfrom user import User
Korpel

私は.fileloader import Fileloaderから使用し、ImportErrorを取得します。名前「Fileloader」をインポートできません
Frikster

3
@Korpel:stackoverflow.com/questions/11536764/…の説明に従って、上記のインポートが機能するかどうかに依存するかどうかを理解します。[1]スクリプトの呼び出し方法(パッケージとしてかどうか)[2]場所実際の作業パスは、それを実行したときです[3]実行環境のパス変数がどのように入力されるか
ecp

@コーペル:私はそれに気づいた。モジュール名の前は、init .pyファイルが存在する場合にのみ存在し、存在しない場合にのみ必要です。省略可能/必須です。
MUG4N

39

あなたのmain.py

from user import Class

どこClassインポートするクラスの名前です。

のメソッドを呼び出す場合はClass、次を使用して呼び出すことができます。

Class.method

__init__.py同じディレクトリに空のファイルがあることに注意してください。


1
インポートしようとしているモジュールにクラスがない場合はどうしますか?生の関数だけですか?python 2では、「インポートモジュール」を実行するだけで済みました。Python 3では機能せず、 'import .module'でも機能しません
Frikster

2
これはを削除した後、python3で機能し__init__.pyます。
engineforce、

13

関数とクラスを自分のものと混合したくない場合は、モジュールをインポートして、その名前でアクセスできます。

import util # imports util.py

util.clean()
util.setup(4)

または、関数とクラスをコードにインポートできます

from util import clean, setup
clean()
setup(4)

wildchar *を使用して、そのモジュールのすべてをコードにインポートできます。

from util import *
clean()
setup(4)

10

python3では、__init__.pyありませんもはや必要。コンソールの現在のディレクトリがpythonスクリプトが配置されているディレクトリである場合、すべてが正常に動作します

import user

ただし、を含まない別のディレクトリから呼び出された場合、これは機能しませんuser.py
その場合は、

from . import user

これは、クラスだけでなくファイル全体をインポートする場合でも機能します。


2
私はvsコードでpylintを使用しており、同じディレクトリのインポートが常にエラーとしてフラグが付けられるという問題を抱えていました(import user赤の下線が引かれていました)。相対インポート(from . import user)に変更され、リンターはフラグを立てなくなりました。
rbatt

9

理解を簡単にするために:

ステップ1:すべてが含まれる1つのディレクトリに移動する

$ cd /var/tmp

ステップ2:いくつかのコードでクラス名がClass1のclass1.pyファイルを作成する

$ cat > class1.py <<\EOF
class Class1:
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    OK = OKBLUE + "[Class1 OK]: " + ENDC
EOF

ステップ3:いくつかのコードでクラス名がClass2のclass2.pyファイルを作成する

$ cat > class2.py <<\EOF
class Class2:
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    OK = OKBLUE + "[Class2 OK]: " + ENDC
EOF

ステップ4:2つの異なるファイルからClass1とClass2を使用するために1回実行される1つのmain.pyを作成します

$ cat > main.py <<\EOF
"""this is how we are actually calling class1.py and  from that file loading Class1"""
from class1 import Class1 
"""this is how we are actually calling class2.py and  from that file loading Class2"""
from class2 import Class2

print Class1.OK
print Class2.OK
EOF

ステップ5:プログラムを実行する

$ python main.py

出力は

[Class1 OK]: 
[Class2 OK]:

4
そして、これが機能せず、main.pyがclass1またはclass2を読み取れない場合はどうなりますか?...何が不足していますか?
darkgaze

6

Python 3


同じdirectory

インポートファイル:log.py

インポートクラス:SampleApp()

import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()

または

ディレクトリはbasicです。

ファイルにインポート:log.py

インポートクラス:SampleApp()

from basic import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()


5

user.pyとdir.pyにクラスが含まれていない場合

from .user import User
from .dir import Dir

動かない。次に、としてインポートする必要があります

from . import user
from . import dir

0

なぜこれが機能するのかわかりませんが、Pycharmビルドを使用しています from file_in_same_dir import class_name

IDEはそれについて不満を述べましたが、まだ機能しているようです。Python 3.7を使用しています


-2

簡単すぎます。ファイル__init__.pyをクラスディレクトリに作成し、次のようにスクリプトにインポートします(すべての場合をインポート)

from classes.myscript import *

選択したクラスのみをインポート

from classes.myscript import User
from classes.myscript import Dir

4
この回答に示されているワイルドカードのインポートは、PEP 8で説明されているように、一般的に不適切なスタイルと見なされます。
V02460 2018

-3

同じディレクトリからインポートする

from . import the_file_you_want_to_import 

サブディレクトリからインポートするには、ディレクトリに含める必要があります

init .py

あなた以外のファイル

ディレクトリからyour_fileをインポートする


3
この回答が他の回答が追加しなかったことを追加するとは思わない。また、他の回答の包括的な要約ではない。だから、なぜあなたがそれを書いたのだろう
lucidbrot

-3

Python3

使用する

from .user import User inside dir.py file

そして

use from class.dir import Dir inside main.py
or from class.usr import User inside main.py

そのようです


3
この回答は、他の回答がすでに行っている以上のものを追加するものではなく、説明もありません。回答編集して追加または改善する方法はありますか?それ以外の場合は、この回答が完全に削除されたように、反対票が投じられることになります。
Das_Geek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.