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

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

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

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

Q&A

解決済

3回答

1008閲覧

Pythonのモジュールのimportについて

puti3809

総合スコア13

Python

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

0グッド

1クリップ

投稿2021/05/24 09:36

ファイルをimportしてimportしたファイルで定義した関数を使用したいです。
ディレクトリ構成は以下のようになっています。
イメージ説明

utils.pyで定義した下記の関数をhuman.pyでimportして使用したいです

def say_twice(word): return (word + '!')*2

human.pyにて

from ..tools import utils def cry(): return utils.say_twice('cry') print(cry())

上記の処理を実行しようとすると、
ImportError: attempted relative import with no known parent package
とエラーが出てしまいます。
対処法をご教授頂けると幸いです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

質問のケースのような場合、「直接実行するpythonスクリプト」により相対的なimportのパスが変わってきます。

現行のpythonでは「親ディレクトリを経由するようなモジュールのimport」を禁止しています。
禁止している旨のエラーメッセージが質問文にも書かれたエラーメッセージです。
humay.pyからutil.pyをimportしようとすると親ディレクトリ経由になるので失敗します。

ただし、それは「human.pyを直接実行した場合」です。

ディレクトリ構造から見て、最終的には実際に直接実行するスクリプトはlesson.pyだと思われます。
lesson.pyからhuman.pyをimportして、human.pyからutil.pyをimportする前提であれば、

[human.py]

python

1from tools import utils 2utils.何らかのメソッド()

と記載することが可能です。それは「直接実行したスクリプトのディレクトリ」が相対importの起点となるからです。
なので、最終的にlesson.pyから実行する予定であれば、上記のようなimportの仕方で良いかと思います。

どうしても単体でhuman.pyを実行したければ、起点となるディレクトリをos.pathに追加することも可能です。

python

1if __name__ == '__main__': 2 import sys, os 3 # human.pyのディレクトリの親ディレクトリをsys.pathに追加 4 sys.path.append(os.path.abspath(os.path.dirname(__file__) + "/..")) 5 6from tools import util 7(以下略)

投稿2021/05/24 10:33

hope_mucci

総合スコア4447

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

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

puti3809

2021/05/25 08:04 編集

とても丁寧なコメントありがとうございます
puti3809

2021/05/25 08:02

丁寧な回答ありがとうございます。 pythonにそんなルールがあったんですね。。。 lesson.pyにて実行していこうと思います!
guest

0

相対インポートはインポートされるモジュールの中でしか使えません。

python

1import sys 2sys.path.append('C:\Users\ユーザ名\Documents\lesson_package') 3from tools import utils 4

に変更しましょう。

画像をアップする前に、ご自身のユーザ名は消しておく方が安全ですよ。

投稿2021/05/24 10:03

ppaul

総合スコア24666

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

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

puti3809

2021/05/25 08:05

回答ありがとうございます。 ユーザー名以後気お付けます!!
guest

0

各ディレクトリに __init__.py ファイルがないためモジュールとして認識されていません。

以下の3ファイルを作成しましょう。

lesson_package/__init__.py lesson_package/talk/__init__.py lesson_package/tools/__init__.py

投稿2021/05/24 09:59

mather

総合スコア6753

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

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

puti3809

2021/05/25 08:06

回答ありがとうございます。 また機会があったらよろしくお願いいたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問