私は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のバグである可能性があります。私を助けようとした人々に感謝したいと思います。