【问题标题】:Python - Getting error whenever I try to run program "Module cannot be found"Python - 每当我尝试运行程序“找不到模块”时都会出错
【发布时间】:2016-09-30 06:21:48
【问题描述】:

我正在尝试做这个小教程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

谢谢

【问题讨论】:

  • 尝试将 libtcodpy 移动到与项目相同的目录。
  • 我已经在目录中有一份副本。
  • 项目所在目录下是否也有libtcod-VS.dlllibtcod-mingw.dll
  • 等一下。您能否在程序顶部(import libtcodpy as libtcod 行之前)添加一行 import os; print(os.getcwd() 并告诉我们它打印出来的内容?

标签: python python-3.x pycharm libtcod


【解决方案1】:

我假设您还将libtcod-VS.dlllibtcod-mingw.dll 复制到项目目录,而不仅仅是libtcodpy.py。还有SDL.dllarial10x10.png。如果没有,请返回并再次查看Setting it up 说明。

但如果你有,这并不是你的错,而是他们的错。

libtcodpy.py 尝试从当前工作目录导入libtcod-VS.dlllibtcod-mingw.dll DLL。你可以从这一行看到:

_lib = ctypes.cdll['./libtcod-mingw.dll']

因此,如果当前工作目录恰好不是libtcodpy.py 所在的目录,则不会在那里找到它们。

这是一件愚蠢的事情。如果您按照Choice of code editor 部分的建议执行并始终从控制台(“DOS 提示符”)运行脚本,它将起作用(只要您始终在没有明确路径的情况下运行它),但它们确实不应该不要依赖它。

不过,这显然是最简单的解决方法:从控制台运行程序,按照他们期望的方式,而不是从 PyCharm。


或者,您可以配置 PyCharm 以将项目目录作为您的工作目录来运行您的项目。

有几种设置方法,但您可能需要的是运行/调试配置对话框(您可以在运行菜单的编辑配置...下找到该对话框)。打开该对话框,打开显示三角形到默认值,单击 Python,然后在右侧查找“工作目录:”。单击 按钮并选择您的项目目录(或您放置libtcod-VS.dlllibtcod-mingw.dll 的任何位置)。


或者您可以编辑libtcodpy.py 使其在自身旁边而不是在当前工作目录中查找DLL。您只需要进行 4 个小改动。

首先,在靠近顶部的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'))

【讨论】:

    【解决方案2】:

    虽然我使用的是 Emacs 和 Python 2.7,但我自己也一直在努力解决同样的问题。

    为我解决问题的是安装 32 位 python 而不是 64 位 python。 libtcod 中的 .dll 是 32 位的,Windows 上的 64 位 python 与 32 位 .dll 不兼容。

    另外,您可能想检查 libtcod 是否与 python 3 兼容。我发现有两个地方讨论了该主题,但我无法确定 libtcod-1.5.1 是否与后来的 3.xs 兼容.

    我还建议尝试运行 libtcod 文件夹中的 samples_py.py 来测试这两个问题,就好像它运行的是您的文件夹设置或路径,而不是您的 python 版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-17
      • 2022-11-07
      • 2022-01-26
      • 2021-10-17
      • 2019-02-10
      • 2021-09-01
      • 1970-01-01
      • 2020-03-08
      相关资源
      最近更新 更多