Lỗi 'ImportError (No module named ex47.game)' khi chạy code Ex47 (LPTHW)

Mình đang học theo cuốn “Learn Python The Hard Way” thì làm đến Ex47 thì vướng lỗi này ?

PS C:\Python27\Exercise\Ex47> nosetests
E
======================================================================
ERROR: Failure: ImportError (No module named ex47.game)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\python27\lib\site-packages\nose\loader.py", line 418, in loadTestsFromName
    addr.filename, addr.module)
  File "c:\python27\lib\site-packages\nose\importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "c:\python27\lib\site-packages\nose\importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "C:\Python27\Exercise\Ex47\tests\ex47_tests.py", line 2, in <module>
    from ex47.game import Room
ImportError: No module named ex47.game

----------------------------------------------------------------------
Ran 1 test in 0.032s

FAILED (errors=1)

Mong mọi người giúp đỡ
Mình đã tham khảo trong topic này


và một số topic khác nhưng vẫn chưa khắc phục được.

1 Like

Up code của bạn lên di.

2 Likes

Code của mình y chang trong sách luôn á bạn

1 Like

file game.py :slight_smile:

class Room(object):

    def __init__(self, name, description):
        self.name = name
        self.description = description
        self.paths = []

    def go(self, direction):
        return self.paths.get(direction, None)

    def add_paths(self, paths):
        self.paths.update(paths)

file ex_tests.py

from nose.tools import *
from ex.game import Room


def test_room():
    gold = Room("GoldRoom",
                """This room has gold in it you can grab. There's a
                door to the north.""")
    assert_equal(gold.name, "GoldRoom")
    assert_equal(gold.paths, [])

def test_room_paths():
    center = Room("Center", "Test room in the center.")
    north = Room("North", "Test room in the north.")
    south = Room("South", "Test room in the south.")
    center.add_paths(['north': north, 'south': south])
    assert_equal(center.go('north'), north)
    assert_equal(center.go('south'), south)

def test_map():
    start = Room("Start", "You can go west and down a hole.")
    west = Room("Trees", "There are trees here, you can go east.")
    down = Room("Dungeon", "It's dark down here, you can go up.")

Sơ đồ là :

Ex\skeleton\
    Directory: C:\Python\Exercise\Ex\skeleton


PS C:\Python\Exercise\Ex\skeleton> ls -R


    Directory: C:\Python\Exercise\Ex\skeleton


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        //   : PM                bin
d-----        //   : PM                docs
d-----        //   : PM                Ex
d-----        //   : PM                tests
-a----        //   : PM             setup.py


    Directory: C:\Python\Exercise\Ex\skeleton\bin


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        //   : PM               __init__.py


    Directory: C:\Python\Exercise\Ex\skeleton\Ex


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        //  : AM             game.py
-a----        //   : PM               __init__.py
-a----        //   : PM             __init__.pyc


    Directory: C:\Python\Exercise\Ex\skeleton\tests


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        //  : PM            ex_tests.py
-a----        //   : PM            ex_tests.pyc
-a----        //   : PM               __init__.py
-a----        //   : PM             __init__.pyc
1 Like

Không có module nào là ex47.game cả, bạn chỉ có file game.py thì trong file ex47_tests.py phải gọi

from game import ...
1 Like

Nó báo lỗi tương tự bạn ơi
Mình có tham khảo một số topic thì nó vẫn để như vậy vẫn được

1 Like

Sửa thành

from Ex47.game import ...

xem sao. Có vẻ như tên folder là Ex47, phải import đúng code mới chịu chạy.

2 Likes

Mình mới sửa tên folder lại thành “ex47”, thì nó lại ra lỗi này

ERROR: tests.ex47_tests.test_room_paths
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\python27\lib\site-packages\nose\case.py", line 197, in runTest
    self.test(*self.arg)
  File "C:\Python27\Exercise\ex47\skeleton\tests\ex47_tests.py", line 17, in test_room_paths
    center.add_paths({'north': north, 'south': south})
  File "C:\Python27\Exercise\ex47\skeleton\ex47\game.py", line 12, in add_paths
    self.paths.update(paths)
AttributeError: 'list' object has no attribute 'update'

======================================================================
ERROR: tests.ex47_tests.test_map
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\python27\lib\site-packages\nose\case.py", line 197, in runTest
    self.test(*self.arg)
  File "C:\Python27\Exercise\ex47\skeleton\tests\ex47_tests.py", line 25, in test_map
    down.add_paths({'up', start})
  File "C:\Python27\Exercise\ex47\skeleton\ex47\game.py", line 12, in add_paths
    self.paths.update(paths)
AttributeError: 'list' object has no attribute 'update'

======================================================================
FAIL: tests.ex47_tests.test_room
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\python27\lib\site-packages\nose\case.py", line 197, in runTest
    self.test(*self.arg)
  File "C:\Python27\Exercise\ex47\skeleton\tests\ex47_tests.py", line 10, in test_room
    assert_equal(gold.paths, {})
AssertionError: [] != {}

----------------------------------------------------------------------
Ran 3 tests in 0.023s

FAILED (errors=2, failures=1)
1 Like

Không có attribute update với kiểu list. Lỗi này do ban đầu bạn gán

Sửa thành

self.paths = {}
1 Like

Cảm ơn bạn nha

ERROR: tests.ex47_tests.test_map
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\python27\lib\site-packages\nose\case.py", line 197, in runTest
    self.test(*self.arg)
  File "C:\Python27\Exercise\ex47\skeleton\tests\ex47_tests.py", line 27, in test_map
    down.add_paths({'up', start})
  File "C:\Python27\Exercise\ex47\skeleton\ex47\game.py", line 12, in add_paths
    self.paths.update(paths)
TypeError: cannot convert dictionary update sequence element #0 to a sequence

----------------------------------------------------------------------
Ran 3 tests in 0.024s

FAILED (errors=1)

Giờ còn duy nhất lỗi này

1 Like

Phải là : chứ không phải là ,.

Xem ra kiến thức về kiểu dữ liệu, đặc biệt là dict của bạn còn chưa được tốt lắm. Đọc thêm:

1 Like

Được rồi, mình cãm ơn bạn nhiều nha
Tại mình cũng mới học nên hơi mông lung :)))
Sẵn tiện cho mình hỏi luôn

from nose.tools import *
from ex47.game import Room

Vậy là nó import hàm * từ nose.tool hay sao vậy ?
Và nếu import file thì mình “tên folder . tên file” hả bạn ?

1 Like

Bạn cũng thấy chẳng có hàm nào có tên là * (theo quy tắc đặt tên)

from <tên thư viện> import * có nghĩa là bạn sẽ gọi ra tất cả các thư viện con và hàm trong thư viện <tên thư viện> với <tên thư viện> là 1 thư viện bất kì như math, os, sys,…

Về cơ bản là vậy.

P/s: Bạn có vẻ chưa học cơ bản kĩ đã nhảy đến ex47 rồi thì phải? Nếu bạn đã học kĩ thì đến bài này bạn phải khá chắc về kiến thức cơ bản rồi.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?