从同一文件夹导入模块时遇到问题

Trouble importing modules from the same folder

我在导入我创建的模块时遇到问题。该模块与我需要从中导入它的模块位于同一文件夹中。我正在开发一个名为 directo_etapas.py 的模块,我需要从那里导入 solvers.py,所以我去:

import math
import solvers

我在导入数学模块时没有遇到任何错误,但我确实遇到了 import solvers 的错误。

我收到这个错误:

"C:\Users\...\Codigos\directo_etapas.py"
Traceback (most recent call last):
  File   "C:\Users\...\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.5.3123.win-x86_64\lib\site-packages\IPython\core\ultratb.py", line 776, in structured_traceback
    records = _fixed_getinnerframes(etb, context, tb_offset)
  File "C:\Users\...\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.5.3123.win-x86_64\lib\site-packages\IPython\core\ultratb.py", line 230, in wrapped
    return f(*args, **kwargs)
  File "C:\Users\...\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.5.3123.win-x86_64\lib\site-packages\IPython\core\ultratb.py", line 267, in _fixed_getinnerframes
    if rname == '<ipython console>' or rname.endswith('<string>'):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe1 in position 80: ordinal not in range(128)
ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.


**Unfortunately, your original traceback can not be constructed.**

请注意,我使用的是 Enthough Canopy。

如@BorrajaX 所示,您看到的回溯可能是由于使用了包含非 ASCII 字符的路径名或文件名。 (非 ASCII 路径名的潜在问题是 Python 2 不像 Python 3 那样始终如一地支持 unicode;Canopy 的后续版本处理得更好,但仍然不完善。)目前,最简单的解决方案是仅使用 ASCII 路径名和文件名。

但如果我理解你的描述,这个 unicode 问题虽然真实且需要修复,但可能是另一个不同的原始错误的次要问题。 (注意"your original traceback can not be reconstructed" 提示在尝试报告原始错误时发生了 unicode 错误。)


您最初的错误可能很简单,就是没有意识到要导入模块,其路径必须在 python 的 sys.path 上。标准 math 模块应该总是如此,因此您几乎总是可以随时导入它。但是(令初学者感到惊讶)它 而不是 通常包含您 运行 的脚本的目录。 IE。仅仅因为你是 运行 directo_etapas.py 并不意味着可以导入同一目录中的其他文件(例如 solvers)。

郑重声明,此问题的 "professional-grade" 解决方案要么是创建一个包含所有相关模块的 "python package"(查找),要么是 "install" 您的库模块(例如 solvers)到您的 python 发行版中,以便它们始终像 math 一样易于访问。但这些工作可能比你现在想做的要多。

如果这确实是您最初错误的根源,那么有两种简单的方法可以确保您的模块目录位于 sys.path

a) 最简单但不太健壮的方法就是确保您是来自该目录的 运行,因为 sys.path 通常以空字符串开头,表示当前目录。

如果您是 运行 Canopy GUI 中的脚本,那么您可以使用“更改到编辑器目录”或“保持目录与编辑器同步”命令来执行此操作,如中所述Canopy 用户指南部分 "Change directory". 否则,如果您是 运行 您的脚本来自 Windows 命令提示符,只需 cd 到 [= 之前​​的那个目录58=] 你的脚本。

b) 对于您希望更广泛地使用但又不想安装的模块,一个更稳健的解决方案是将它们的包含路径放入 PYTHONPATH 环境中多变的。有关更多信息,请参阅 this article.

(您还可以通过查找主脚本所在的目录(请参阅 __file__)编写代码以确保所需目录位于 sys.path,然后将其设为当前工作目录,或将其插入 sys.path。但是这些解决方案闻起来有点老套。)