我无法导入我创建的模块。该模块与我需要导入它的模块位于同一文件夹中。我正在开发一个名为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。
答案 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
到该目录。
cd
环境变量中。有关详情,请参阅"Change directory"。
(您也可以编写代码以确保所需目录位于PYTHONPATH
,方法是查找主脚本所在的目录(请参阅this article),然后将其设为当前目录工作目录,或将其插入sys.path
。然而,这些解决方案闻起来有点hacky。)