2017-02-09 15 views
1

私はたくさんのpythonスクリプトを持っており、それらのほとんどをサブディレクトリに入れて構造化したいと考えています。しかし、私がサブディレクトリからスクリプトを読み込もうとすると、Pythonは私にサブディレクトリスクリプトのインポート方法に応じて異なるエラーメッセージを表示します。サブディレクトリからのPython3.5のインポートが機能しません

私のサブディレクトリは、次のようになります。私は

from io import dataset_creator 

を行う際に、このエラーが発生し、親ディレクトリから私のスクリプトで

io 
├── dataset_creator.py 
└── read_data.py 

ImportError: cannot import name 'dataset_creator' 

私は

を行うと
import io.dataset_creator 

このエラーが発生します。

ImportError: No module named 'io.dataset_creator'; 'io' is not a package 

私もIOに__init__.pyに触れた/それがすべてで役立つだけでなく、/ ioにドットが、運が先行しませんでした。 Pythonのドキュメントでは、__init__.pyを追加する必要があり、基本的にはすべてがうまくいくはずです(私が解釈する限り)。

誰でも私を助けることができますか?私がいくつかの重要な情報を省いたら、私に教えてください。私はそれを追加します。

乾杯、 ヤコブ

EDIT:、ioは、すでにPythonで別のパッケージで述べたあなたの多く

はそう問題を修正しました別の何かに/私のIOの名前を変更(も__init__.pyを持ちながら) 。どうもありがとうございました! 私は複数の正解があることを知っていますが、私はちょうど、申し訳ありませんが正しいとマークすることができます。

+0

'' io 'はパッケージではありません.... ....ヒント:Pythonでは、パッケージとは何ですか? –

+0

'__init __。py'が見つかりませんでしたか? – yedpodtrzitko

+0

私のフォルダの名前はioです – StrawHat

答えて

1

によって既にioという名前が使用されています。インタプリタによって使用される非常に基本的なモジュールの1つであるため、コードが実行される前に、起動プロセス中にロードされます。これは、Pythonがio.dataset_creatorのインポート要求を表示するまでに、すでにioモジュールがsys.modulesにあることを意味します。そのモジュールはパッケージではないので、ioパッケージに書いた他のサブモジュールをロードしようとしません(モジュール検索パスを設定して、パッケージが標準ライブラリよりも先に来た場合でも)。

ioパッケージの名前を変更する必要があります。 1つのオプションは別のパッケージの中に入れることです(mypackage.io.dataset_creatorはうまく動作するはずです)。より具体的なもの(例:myproject_io)で名前ioを置き換えることもできます。

0

あるので、それはPYTHONPATHにあなたの親パスを追加

私はここに同様の質問に答えている、それが失敗だということをUsing exec on a file in a different directory causes module import errors

可能です: import sys sys.path.append("/path/to/parentfolder")

あなたはos.path.dirname(__file__)にを使用することができますハードコードされたパス以外のファイルの絶対パスを取得します。

__init__.pyを親フォルダとioフォルダに追加するには、ディレクトリ以外のpythonパッケージとして作成します。

モジュールをインポートする:あなたは import io.dataset_creator as dcreator

parent/ 
    -- app.py 
    -- io/ 
     --dataset_creator.py 
     --read_data.py 

はapp.py:私はそれをテストしたとき

import sys 
sys.path.append(os.path.abspath(os.path.dirname(__file__))) 
import io.dataset_creator as dcreator 
0

これは、Python 3.5.1上にも私に起こりました。

ディレクトリioを他のもの(私はmy_ioを使用)に改名して問題を修正しました。私のテストケースでした:

main.py 
my_io 
├── module.py 
└── something.py 

ディレクトリの名前を変更したときに、両方のモジュールが正しくインポートされました。 ioディレクトリをこれと似たようなものに変更することをお勧めします。

これは何とか矛盾していた内部のPythonモジュールioと関係があります。

0

問題の再作成:

mkdir io 
touch dataset_creator.py 
touch read_data.py 
python3 -c 'from io import dataset_creator' 
python3 -c 'import io.dataset_creator' 

は、エラーメッセージを与えます。

ソリューション:

  1. "IO" と呼ばれる別のサブディレクトリを作成し、そこにファイルを置きます。
  2. "io"とは異なる名前を使用します。その名前のモジュールはすでに存在します。

説明:

あなたはIOディレクトリに既にあるので、あなたは、 "IO" を指定する必要はありません。あなたは、単に行うことができます。

python3 -c 'import dataset_creator' 
python3 -c 'import read_data' 

そして、あなたはあなたのpythonファイル内の関数やクラスを追加すると:

def hello_world(): 
    print("hello world") 

あなたはこのようにインポートすることができます。下のコードを整理する

python3 -c 'from read_data import hello_world' 

ioモジュールの傘を作成し、次のように別のioディレクトリを作成し、それを使ってPythonコードを保存します:

ia (parent dir where you do the import) 
├── ia 
│ ├── dataset_creator.py 
│ └── read_data.py 
├── .gitignore 
├── requirements.txt 
├── setup.py 
└── README.md 

python3 -c 'import ia.dataset_creator' 

注意ディレクトリ名を "ia"に変更し、すでに存在する "io"モジュール(ref)もあります。

関連する問題