第一次尝试让 PLY 工作

Trying to make PLY work for the first time

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

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

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

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 还是个新手)。

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

至于为什么在交互模式下不能执行,这里稍微说一下交互模式和运行as script from the IEP wizard的区别:

Interactive mode vs running as script

You can run the current file or the main file normally, or as a script. When run as script, the shell is restared (sic) to provide a clean environment. The shell is also initialized differently so that it closely resembles a normal script execution.

In interactive mode, sys.path[0] is an empty string (i.e. the current dir), and sys.argv is set to [''].

In script mode, __file__ and sys.argv[0] are set to the scripts filename, sys.path[0] and the working dir are set to the directory containing the script.

这稍微解释了 inspect.getfile(__main__) 抛出错误的原因:__main__ 没有属性 __file__。还有为什么我必须将当前目录插入 sys.path:sys.path 在交互模式下没有当前目录。

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