0

我是 Python 新手,在尝试使 PLY 正常工作时遇到了一些问题。现在,我只想从PLY 主页成功运行示例

起初我尝试只下载 PLY-3.8,将ply文件夹放在我保存示例 ( calc.py )的同一目录中并运行它。calc.py文件位于C :\Users\...\Python目录,而ply文件夹位于C:\Users\...\Python\ply,只是为了更清楚。但我得到了一个ImportError: No module named 'ply'.

然后我搜索了一段时间,尝试更新一个名为distutils的东西并通过 Windows PowerShell 安装模块等等,但这些都不起作用,我只是重置了整个东西(重新安装 Python 和所有这些)。但后来我终于通过简单地将我正在运行的脚本(编辑:在交互模式下)所在的目录路径插入到sys.path中,通过这样做:

import sys
sys.path.insert(0,'C:\\Users\\ ... \\Python')

这修复了ImportError但是,这就是我现在所在的位置,还有许多其他错误:

Traceback (most recent call last):
  File "C:\Users\...\Python\calc.py", line 48, in <module>
    lexer = lex.lex()
  File "C:\Users\...\Python\ply\lex.py", line 906, in lex
    if linfo.validate_all():
  File "C:\Users\...\Python\ply\lex.py", line 580, in validate_all
    self.validate_rules()
  File "C:\Users\...\Python\ply\lex.py", line 822, in validate_rules
    self.validate_module(module)
  File "C:\Users\...\Python\ply\lex.py", line 833, in validate_module
    lines, linen = inspect.getsourcelines(module)
  File "c:\users\...\python\python35\lib\inspect.py", line 930, in getsourcelines
    lines, lnum = findsource(object)
  File "c:\users\...\python\python35\lib\inspect.py", line 743, in findsource
    file = getsourcefile(object)
  File "c:\users\...\python\python35\lib\inspect.py", line 659, in getsourcefile
    filename = getfile(object)
  File "c:\users\...\python\python35\lib\inspect.py", line 606, in getfile
    raise TypeError('{!r} is a built-in module'.format(object))
TypeError: <module '__main__'> is a built-in module

现在我完全不知道该怎么办。我试图寻找解决方案,但没有运气。如果有人可以帮助我,我将不胜感激。

如果这些信息很重要,我在Windows 10上,使用Python 3.5.0iep作为我的 IDE (www.iep-project.org)。

简而言之:我只想从 PLY 主页成功运行示例,然后我想我可以弄清楚其余的。

编辑:我发现如果我这样做:

import inspect
inspect.getfile(__main__)

我从以前得到完全相同的(最后一个)错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "c:\users\...\python\python35\lib\inspect.py", line 606, in getfile
    raise TypeError('{!r} is a built-in module'.format(object))
TypeError: <module '__main__'> is a built-in module

我认为这是罪魁祸首,但我仍然不知道如何解决它。

编辑2:我让它工作并回答了解释如何的问题,但如果有人有更完整的答案,我很想听听。

4

1 回答 1

0

对于遇到此问题的任何人,我都发现了问题所在。我仍然不知道为什么会这样,所以如果有人能提供更完整的答案,我将不胜感激(我仍然是 Python 的新手)。

无论如何,这段代码似乎无法在交互模式下执行,它需要作为脚本执行。要在IEP上执行此操作,请使用Run > Run file as scriptCtrl+Shift+E。在空闲时,您需要打开...文件(Ctrl+O),然后运行模块F5)。

至于为什么不能在交互模式下执行,这里有一点关于交互模式和从 IEP 向导中作为脚本运行的区别:

交互模式与作为脚本运行

您可以正常运行当前文件或主文件,也可以作为脚本运行。当作为脚本运行时,shell 会重新启动(原文如此)以提供一个干净的环境。shell 的初始化方式也不同,因此它非常类似于正常的脚本执行。

在交互模式下,sys.path[0] 为空字符串(即当前目录),sys.argv 设置为['']。

在脚本模式下,__file__ 和 sys.argv[0] 设置为脚本文件名,sys.path[0] 和工作目录设置为包含脚本的目录。

这就解释了为什么 inspect.getfile(__main__) 会抛出错误:__main__ 没有属性 __file__。以及为什么我必须将当前目录插入到 sys.path 中:sys.path 在交互模式下没有当前目录。

我希望这可以帮助别人。

于 2015-11-07T17:32:46.413 回答