Python - 运行程序时总是出现错误“找不到模块”
我正在尝试做一个小教程,链接在这里:http://www.roguebasin.com/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod,_part_1
在页面往下翻一点,看到“移动”的部分之前,有一句话提到要测试一下你目前的进展。我正在用Pycharm,这是我第一次使用外部库,或者你可以叫它其他名字。
这是我目前的代码,和他们的示例完全一样:
import libtcodpy as libtcod
#actual size of the window
SCREEN_WIDTH = 80
SCREEN_HEIGHT = 50
LIMIT_FPS = 20 #20 frames-per-second maximum
libtcod.console_set_custom_font('terminal.png', libtcod.FONT_TYPE_GREYSCALE | libtcod.FONT_LAYOUT_TCOD)
libtcod.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, 'python/libtcod tutorial', False)
libtcod.sys_set_fps(LIMIT_FPS)
while not libtcod.console_is_window_closed():
libtcod.console_set_default_foreground(0, libtcod.white)
libtcod.console_put_char(0, 1, 1, '@', libtcod.BKGND_NONE)
libtcod.console_flush()
每次我运行它时,都会出现这个错误。
Traceback (most recent call last):
File "D:\Programming\Project 1\Rogue Like\libtcodpy.py", line 57, in <module>
_lib = ctypes.cdll['./libtcod-mingw.dll']
File "C:\Python34\lib\ctypes\__init__.py", line 426, in __getitem__
return getattr(self, name)
File "C:\Python34\lib\ctypes\__init__.py", line 421, in __getattr__
dll = self._dlltype(name)
File "C:\Python34\lib\ctypes\__init__.py", line 351, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] The specified module could not be found
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:/Programming/Project 1/Rogue Like/firstrl.py", line 1, in <module>
import libtcodpy as libtcod
File "D:\Programming\Project 1\Rogue Like\libtcodpy.py", line 60, in <module>
_lib = ctypes.cdll['./libtcod-VS.dll']
File "C:\Python34\lib\ctypes\__init__.py", line 426, in __getitem__
return getattr(self, name)
File "C:\Python34\lib\ctypes\__init__.py", line 421, in __getattr__
dll = self._dlltype(name)
File "C:\Python34\lib\ctypes\__init__.py", line 351, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] The specified module could not be found
谢谢!
2 个回答
我最近也遇到了同样的问题,不过我用的是Emacs和Python 2.7。
对我来说,解决这个问题的方法是安装一个32位的Python,而不是64位的。因为libtcod里的.dll文件是32位的,而在Windows上,64位的Python和32位的.dll文件不兼容。
另外,你可能还需要检查一下libtcod是否和Python 3兼容。我找到过两个地方讨论这个话题,但我不确定libtcod-1.5.1是否和后来的3.x版本兼容。
我还建议你试着运行libtcod文件夹里的samples_py.py来测试这两个问题。如果这个能运行,那说明问题出在你的文件夹设置或路径上,而不是你的Python版本。
我假设你已经把 libtcod-VS.dll
或 libtcod-mingw.dll
复制到了项目目录,而不仅仅是 libtcodpy.py
。还有 SDL.dll
和 arial10x10.png
也要一起复制。如果没有的话,建议你回去再看看 设置说明。
不过如果你都做了,那就不是你的错,是他们的问题。
libtcodpy.py
会尝试从当前工作目录中导入 libtcod-VS.dll
或 libtcod-mingw.dll
这个DLL文件。你可以从这行代码看出来:
_lib = ctypes.cdll['./libtcod-mingw.dll']
所以,如果当前工作目录不是 libtcodpy.py
所在的目录,它就找不到这些文件。
这真是个愚蠢的设计。如果你按照 选择代码编辑器 部分的建议,从控制台(也就是“DOS提示符”)运行脚本,它就能正常工作(只要你不指定路径),但他们不应该依赖这个方法。
不过,最简单的解决办法就是:按照他们的预期,从控制台运行程序,而不是从PyCharm里运行。
另外,你也可以配置PyCharm,让它在项目目录下运行你的项目。
有几种方法可以设置这个,但你可能想用的是运行/调试配置对话框(可以在运行菜单的“编辑配置…”中找到)。打开这个对话框,展开默认设置的三角形,点击Python,然后在右边找到“工作目录:”。点击 …
按钮,选择你的项目目录(或者你放 libtcod-VS.dll
或 libtcod-mingw.dll
的地方)。
或者你可以编辑 libtcodpy.py
,让它在自己所在的目录中寻找DLL,而不是在当前工作目录中。你只需要做四个小改动。
首先,在顶部的 import
语句中间,如果没有 import os
,就加上它。
接下来,在 import
语句之后,添加以下内容:
modpath = os.path.dirname(os.path.abspath(__FILE__))
然后找到以 _lib = ctypes.dll
开头的两行(或者直接看回溯中的行号),并按如下方式修改:
_lib = ctyles.cdll(os.path.join(modpath, 'libtcod-mingw.dll'))
_lib = ctyles.cdll(os.path.join(modpath, 'libtcod-VS.dll'))