1

私はPythonでいくつかの単体テストを行っていますが、すべてうまくいきましたが、問題が非常に奇妙で、インポートで問題が発生したと思います:

私が行った別のテストのように、テストでオブジェクト GlanceApi を作成しようとしていますが、次のエラーが発生しました:

======================================================================
ERROR: setUpClass (__main__.TestGlance)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "glance_tests.py", line 22, in setUpClass
    self.glnce = glance.GlanceApi("")
AttributeError: 'module' object has no attribute 'GlanceApi'

これは私のコードです:

import unittest
import json
import time
import sys
sys.path.append("../src")
import glance
import novaapiclient

class TestGlance(unittest.TestCase):

    @classmethod
    def setUpClass(self):
        confFile = file('config.txt', 'r+w')
        configs = ""
        for line in confFile:
            if not (line.startswith('#')) and len(line) != 0:
                configs  = line.split(';')

        novaAPI = novaapiclient.NovaApiClient(str(configs[0]))
        novaAPI.make_auth(configs[1], configs[2], configs[3])

        self.glnce = glance.GlanceApi() # << HERE ERROR
        self.glnce.set_auth_obj(novaAPI.get_auth_obj())

私が行った別のテストのように見えますが、この場合は機能しません。前もって感謝します。

これは一見のソースです:

import pycurl
import cStringIO
import os

class GlanceApi:

    def __init__(self):
        self.auth = ""
        self.http_handler = ""

    def set_auth_obj(self, authenticate):
        self.auth = authenticate


    def list_images(self, is_public=False, with_details=False):

        if self.auth.is_authed() == False:
            return False

        self.http_handler = pycurl.Curl()
        printer = cStringIO.StringIO()

        if with_details == False:
            url_complement = "/images"
        else:
            url_complement = "/images/detail"

        if is_public == False:
            full_url = str(self.auth.get_image_URL() + url_complement)
        else:
            full_url = str(self.auth.get_image_URL()[:30] + url_complement)

        headers = ["X-Auth-Token:%s" % str(self.auth.get_auth_token())]

        self.http_handler.setopt(pycurl.URL, full_url)
        self.http_handler.setopt(pycurl.HTTPGET, 1)
        self.http_handler.setopt(pycurl.HTTPHEADER, headers)
        self.http_handler.setopt(pycurl.WRITEFUNCTION, printer.write)
        self.http_handler.perform()

        http_code = int(self.http_handler.getinfo(pycurl.HTTP_CODE))
        self.http_handler.close()

        return printer.getvalue()


    def get_image_metadata(self, id, is_public=False):

        if self.auth.is_authed() == False:
            return False

        self.http_handler = pycurl.Curl()
        printer = cStringIO.StringIO()

        url_complement = "/images/%s" % id

        # Setting the request url according the is_public parameter.
        if is_public == False:
            full_url = str(self.auth.get_image_URL() + url_complement)
        else:
            full_url = str(self.auth.get_image_URL()[:30] + url_complement)

        headers = ["X-Auth-Token:%s" % str(self.auth.get_auth_token())]

        self.http_handler.setopt(pycurl.URL, full_url)
        self.http_handler.setopt(pycurl.CUSTOMREQUEST, 'HEAD')
        self.http_handler.setopt(pycurl.HTTPHEADER, headers)
        self.http_handler.setopt(pycurl.WRITEFUNCTION, printer.write)
        self.http_handler.perform()

        http_code = int(self.http_handler.getinfo(pycurl.HTTP_CODE))
        self.http_handler.close()

        return printer.getvalue()


    def add_image(self,  file_path, name, is_public=False):
        # Verifying if the user is authenticated.
        if self.auth.is_authed() == False:
            return False

        self.http_handler = pycurl.Curl()
        printer = cStringIO.StringIO()

        url_complement = "/images"

        if is_public == False:
            full_url = str(self.auth.get_image_URL() + url_complement)
        else:
            full_url = str(self.auth.get_image_URL()[:30] + url_complement)

        size = os.path.getsize(file_path)

        image = [(str(name), (pycurl.FORM_FILE, str(file_path)))]

        headers = ["X-Auth-Token:%s" % str(self.auth.get_auth_token()), "x-image-meta-name:%s" % name, "x-image-meta-size:%s" % str(size)]
        if is_public == True:
            headers.append("x-image-meta-is-public:true")

        self.http_handler.setopt(pycurl.URL, full_url)
        self.http_handler.setopt(self.http_handler.HTTPPOST, image)
        self.http_handler.setopt(pycurl.HTTPHEADER, headers)
        self.http_handler.setopt(pycurl.WRITEFUNCTION, printer.write)
        self.http_handler.perform()

        http_code = int(self.http_handler.getinfo(pycurl.HTTP_CODE))
        self.http_handler.close()

        return printer.getvalue()

これはディレクトリ構造です:

Project
   + src/
      - glance.py
      - ...
   + Tests/
      - glance_tests.py
      - ...

解決済み編集 、どうやって?わかりませんが、これを実行しました。glanceapi.py という名前の新しいファイルを作成し、glance.py ファイルの内容をコピーし、インポート時に名前を変更すると機能します。何が問題なのかわかりません、Pythonのバグである可能性があります。私を助けようとした人々に感謝したいと思います。

4

1 に答える 1

0

IDLEに移動し、PYTHONPATHが何であるかを確認します。

import sys
sys.path

また、Glanceが配置されている場所がパスに見つからない場合は、sys.path.append()を使用して挿入/追加する必要があると思います。ここでパラメータなどを実行する方法を見てください:http ://effbot.org/librarybook/sys.htm

編集:これが機能しない場合はお知らせください。

于 2012-05-10T13:31:52.290 に答える