【问题标题】:Trying to make PLY work for the first time第一次尝试使 PLY 工作
【发布时间】:2015-11-07 02:27:52
【问题描述】:

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

起初我尝试只下载 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 和所有这些)。但后来我终于通过简单地将我正在运行的脚本(edit: 在交互模式下)所在的目录路径插入到 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:我得到它的工作并回答了解释如何的问题,但如果有人有更完整的答案,我很想听听。

【问题讨论】:

    标签: python ply interactive-mode


    【解决方案1】:

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

    无论如何,这段代码好像不能在交互模式下执行,需要作为脚本来执行。要在IEP 上执行此操作,请使用 Run > Run file as scriptCtrl+Shift+E。在 IDLE 上,您需要 Open... 文件 (Ctrl+O),然后 Run Module (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 在交互模式下没有当前目录。

    我希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-03-24
      • 2022-12-26
      • 1970-01-01
      • 2013-07-03
      • 2013-07-01
      • 2019-04-29
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      相关资源
      最近更新 更多