2017-11-13 14 views
1

Python(JS開発者)には新しく、テストスイートを実行しようとしています。プロジェクトのフォルダ構造は次のとおりです。ユニットテストでインポートエラーが発生しました:ローカルライブラリから「No module named ...」

​​

端末では、私はpython tests_s3panda.pyを実行しています。私はそれがローカルモジュールを見つけることができないのですか理解していない

Traceback (most recent call last): File "tests_s3panda.py", line 7, in from libs.s3panda import S3Panda ImportError: No module named libs.s3panda

tests_s3panda.pyスニペット:相対パスのためfrom ..libs.s3panda import S3Pandaを行う

from __future__ import absolute_import 

import unittest 

import pandas as pd 

from libs.s3panda import S3Panda 


class TestS3Panda(unittest.TestCase): 
    ... 

、私が取得:

ValueError: Attempted relative import in non-package

+0

このコマンドを実行すると、どのディレクトリにいますか? – MrName

答えて

0

私は事実を信じていますtは存在しません。init.pyは、最上位フォルダに、libstestsの両方がprojectという同じモジュールの一部であることをPythonが認識していないことを意味します。

projectフォルダに__init__.pyを追加して、from project.libs.s3panda import S3Pandaというインポートステートメントを作成してください。一般的に、相対インポートではなく絶対インポートを指定する必要があります(When to use absolute imports)。

+0

は質問の前にそれを含めていませんでしたが、 '__init __。py'は常にプロジェクトフォルダに存在していました。また、あなたがリンクしたURLには、PEP8(2013) – Growler

+0

の時点で相対インポートが正常であると記載されています。それでは、PYTHONPATHを設定する必要があるかもしれません。 'export PYTHONPATH = X:$ PYTHONPATH'を実行し、Xを' project'フォルダの親ディレクトリで置き換えます。次に、絶対インポートでそれを試してください。また、申し訳ありませんが、急いでコピーされたリンクです。しかし、Google Pythonスタイルガイド(https://google.github.io/styleguide/pyguide.html#Imports)またはPEP8(https://www.python.org/dev/peps/pep-0008/#imports)をご覧ください。 )。大部分の人はおそらく自分の混乱を避けるために絶対輸入を使うことをお勧めします。 –

+0

ああ、あなたが私のリンクで言及している見積もりが実際にPEP8自体から来ているのが分かります。とにかく、一般的に相対パスを使用することはお勧めしません。代わりに、デフォルトで絶対パスを使用する必要があります。正当な理由がある場合にのみ、相対パスを使用する必要があります。上記の私のリンクでPEP8を見ると、これについてもっと説明があります。 –

関連する問題