2017-01-04 7 views
2

自分のカスタムNYTモジュールをインポートできないようです。次のように私のプロジェクト構造があると私は、Mac上でだ:カスタムモジュールのインポートに関する問題

articulation/ 
    articulation/ 
     __init__.py # empty 
     lib/ 
      nyt.py 
      __init__.py # empty 
     tests/ 
      test_nyt.py 
      __init__.py # empty 

私はその最初の親ディレクトリからpython articulation/tests/test_nyt.pyを実行しようとすると、私は

File "articulation/tests/test_nyt.py", line 5, in <module> 
    from articulation.lib.nyt import NYT 
    ImportError: No module named articulation.lib.nyt 

を取得し、私も

(venv) Ericas-MacBook-Pro:articulation edohring$ Python -m articulation/tests/test_nyt.py 
/Users/edohring/Desktop/articulation/venv/bin/Python: Import by filename is not supported. 
を試してみました

test_nyt.py

import sys 
sys.path.insert(0, '../../') 
import unittest 
#from mock import patch 
# TODO: store example as fixture and complete test 

from articulation.lib.nyt import NYT 

class TestNYT(unittest.TestCase): 
    @patch('articulation.lib.nyt.NYT.fetch') 
    def test_nyt(self): 
     print "hi" 
     #assert issubclass(NYT, Article) 
     # self.assertTrue(sour_surprise.title == '')""" 


nyt.py 

     from __future__ import division 

import regex as re 
import string 
import urllib2 
from collections import Counter 

from bs4 import BeautifulSoup 
from cookielib import CookieJar 

PARSER_TYPE = 'html.parser' 


class NYT: 
    def __init__(self, title, url): 
     self.url = url 
     self.title = title 
     self.words = get_words(url) 


def get_words(url): 
    cj = CookieJar() 
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
    p = opener.open(url) 
    soup = BeautifulSoup(p.read(), PARSER_TYPE) 
    # title = soup.html.head.title.string 
    letters = soup.find_all('p', class_='story-body-text story-content') 
    if len(letters)==0: 
     letters = soup.find_all('p', class_='paragraph--story') 
    if len(letters)==0: 
     letters = soup.find_all('p', class_='story-body-text',) 
    words = Counter() 
    for element in letters: 
     a = element.get_text().split() 
     for c in a: 
      c = ''.join(ch for ch in c if c.isalpha()) 
      c = c.lower() 
      if len(c) > 0: 
       words[c] += 1 
    return words 



def test_nyt(): 
    china_apple_stores = NYT('title_test', 'http://www.nytimes.com/2016/12/29/technology/iphone-china-apple-stores.html?_r=0') 
    assert(len(china_apple_stores.words) > 0) 
    # print china_apple_stores.words 
    fri_brief = NYT('Russia, Syria, 2017: Your Friday Briefing', 'http://www.nytimes.com/2016/12/30/briefing/us-briefing-russia-syria-2017.html') 
    assert(fri_brief.title == 'Russia, Syria, 2017: Your Friday Briefing') 
    assert(fri_brief.url == 'http://www.nytimes.com/2016/12/30/briefing/us-briefing-russia-syria-2017.html') 
    assert(len(fri_brief.words) > 0) 
    vet = NYT('title_test', 'http://lens.blogs.nytimes.com/2017/01/03/a-love-story-and-twins-for-a-combat-veteran-amputee/') 
    assert(len(vet.words)>0) 
    print "All NYT Tests Passed" 




#test_nyt() 

私は以下を試してみましたが、うまくいかないようです - これを修正する方法を誰かが知っていますか? - >助けてくれない
- Entering Memory Python 2を使用しているため、Pythonはこれを見つけることができませんでした。これが問題であれば、私が何を試みたかを投稿できます。 - これを行う

+1

相対インポートでは、(最初​​の学習曲線では)次のようになります。 'from ..lib.nyt import NYT' –

+0

フォワードスラッシュで判断すると、Windows以外のシステム上にあることになります。あなたの現在のディレクトリは、Pythonのパスにないかもしれません。コマンドラインから 'python -c 'import articulation''を実行し、エラーが発生したかどうか確認してください。 –

+0

相対インポートを試行してもうまくいきませんでした:(venv)edohring-mbp1:アーティキュレーションedohring $ Pythonアーティキュレーション/ tests/test_nyt.py トレースバック(最新のコール最後): ファイル "articulation/tests/test_nyt.py"非パッケージ (venv)edohring-mbp1で相対インポートをしようとしました:: ..lib.nytインポートNYT とValueErrorから で5行目、関節edohringの$ PWD /ユーザ/ edohring /デスクトップ/関節 –

答えて

0

の下の提案から上部にあるのsys.pathの追加:

import sys 
sys.path.insert(0, '../../') 

は、通常は悪い考えです。時には、何かをテストしているときや、短時間しか働かせずに捨てる使い捨てのプログラムがあるときに便利なこともありますが、一般的には悪い習慣ですディレクトリを移動したり、他の人にコードを渡したりすると、作業が停止する可能性があります。私はあなたにそれをする習慣を身に付けさせないように助言します。

表示されるエラーの種類を取得する最も一般的な理由は、ディレクトリ/Users/edohring/Desktop/articulationsys.pathに表示されないことです。最初に行うべきことは、実際にsys.pathであるかを確認し、それを行うための一つの良い方法は、に一時的にtest_nyt.pyの上部にこれらの行を入れている。そして、実行

import os.path, sys 
for p in sys.path: 
    print(p) 
    if not os.path.isabs(p): 
     print(' (absolute: {})'.format(os.path.abspath(p))) 
sys.exit() 

python articulation/tests/test_nyt.py 

出力を見てください。 Pythonがモジュールを見つけるために参照する各ディレクトリパスの行を取得し、それらのパスのどれかが相対パスであれば、対応する絶対パスを出力して、混乱がないようにします。 /Users/edohring/Desktop/articulationはこのリストのどこにも表示されません。

それが事実であることが判明した場合、それを修正するための最も簡単な(しかし、少なくとも将来性)の方法は、シェルで

export PYTHONPATH=".:$PYTHONPATH" 

を実行することである(ないPythonで!)あなたは、Pythonを使用する前にあなた自身のモジュールを使って何かをする。 PYTHONPATHという名前のディレクトリは、Pythonの起動時にsys.pathに追加されます。これは、ターミナルウィンドウを開くたびにシェルによって読み取られる$HOME/.bashrcのようなファイルに入れない限り、一時的な修正に過ぎません。これとbetter ways to add the proper directory to sys.path in this questionについて読むことができます。おそらく、

スクリプトを実行するためのより良い方法は、これは、ディレクトリ /Users/edohring/Desktop/articulationで実行する必要があります

python -m articulation.tests.test_nyt 

シェルのコマンドを使用することで、あるいは少なくともそのディレクトリは、コマンドの順序でsys.pathで表示する必要があります働くしかし、このようにして-mスイッチを使用すると、Pythonはsys.pathの設定方法に多少の違いがあります。 how sys.path is populated in this answerについて詳しく読むことができます。

関連する問題