无法从同一文件夹导入模块

时间:2016-11-06 19:38:25

标签: python import enthought canopy

我无法导入我创建的模块。该模块与我需要导入它的模块位于同一文件夹中。我正在开发一个名为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。

1 个答案:

答案 0 :(得分:0)

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

但是,如果我理解你的描述,这个unicode问题,虽然真实和需要修复,可能是次要的不同的原始错误。 (注意“无法重建原始回溯”,表示在尝试报告原始错误时发生了unicode错误。)

您的原始错误可能很简单,因为没有意识到为了导入模块,其路径必须位于python的sys.path上。标准math模块应始终如此,因此您几乎可以随时导入它。但是(对于初学者来说令人惊讶),对于包含您正在运行的脚本的目录,通常是正确的。即仅仅因为您正在运行directo_etapas.py并不意味着可以导入同一目录中的其他文件(例如solvers)。

为了记录,这个问题的“专业级”解决方案要么创建一个包含所有相关模块的“python包”(查找它),要么“安装”你的库模块(例如{{1转入你的python发行版,这样它们总是和solvers一样可访问。但这些可能比你现在想做的更多。

如果这确实是原始错误的来源,那么有两种简单的方法可以确保模块的目录位于math

a)最简单但不太健壮,只是为了确保你从该目录运行,因为sys.path通常以空字符串开头,这意味着当前目录。

如果您正在Canopy GUI中运行脚本,那么您可以使用“更改到编辑器目录”或“保持目录同步到编辑器”命令执行此操作,如“Canopy用户指南”部分{{3否则,如果从Windows命令提示符运行脚本,则在运行脚本之前只需sys.path到该目录。

b)一个更强大的解决方案,对于您希望更广泛地使用但不希望安装工作的模块,是将它们包含的路径放入cd环境变量中。有关详情,请参阅"Change directory"

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