【问题标题】:Pyinstaller and Ply IOError: source code not availablePyinstaller 和 Ply IOError:源代码不可用
【发布时间】:2016-02-23 22:54:46
【问题描述】:

我对 pyinstaller 还是很陌生,但我已经为此问题苦苦思考了几天,但我似乎无法弄清楚出了什么问题。我的脚本运行正常,但是当我尝试使用 pyinstaller 构建时抛出 IOerror,我的模块(包括 ply.lex)似乎包含在内,但也许我是个白痴?如果有人有任何建议,将不胜感激......

这是我的错误(第 65 行是构建词法分析器的位置)

  Traceback (most recent call last):
  File "<string>", line 65, in <module>
  File "site-packages/ply/lex.py", line 906, in lex
  File "site-packages/ply/lex.py", line 580, in validate_all
  File "site-packages/ply/lex.py", line 822, in validate_rules
  File "site-packages/ply/lex.py", line 833, in validate_module
  File "inspect.py", line 690, in getsourcelines
  File "inspect.py", line 529, in findsource
IOError: source code not available

如果有人以前遇到过这个问题,或者可以提供帮助,那就太棒了。

【问题讨论】:

    标签: python python-2.7 pyinstaller ply


    【解决方案1】:

    PLY 坚持在文件 中定义其语法。真实的文件,有名字和一切。我认为这是因为它缓存计算的语法表的策略,其中涉及将缓存表的时间戳与原始文件的时间戳进行比较。

    显然,Pyinstaller 将语法评估为&lt;string&gt;,因为它是从档案中提取的,而不是文件。 (Pyinstaller 手册提到 __file__ 没有为冻结的应用程序正确设置,这就是 PLY 正在查看的内容。)您可以在创建安装程序包时尝试使用 --onedir 选项,但当然这有点不同的行为。

    【讨论】:

    • 谢谢,也许我不够具体,或者我对 lex 的运作方式有误解。我知道 yacc 会生成缓存表,但我认为 lex 没有?我实际上并没有使用 yacc,因为它超出了我的需要。我只是在 lex 中进行标记,并完成了对输出进行排序的功能。我试过 --onedir 无济于事,但我会更深入地研究它,看看它是否有帮助....
    • @blackmetalmcdonalds:无论如何,PLY 坚持 __file__ 是正确的模块路径。即使没有充分的理由。我对pyinstaller了解不多,但基本上你需要弄清楚如何让它提供可用的__file__
    【解决方案2】:

    似乎使用 PLY 有必要包含 py 文件本身 如THIS 链接所述,解决方法是将文件添加到 pyinstaller 生成的 .spec 文件中,如下所示:

    datas=[('calc.py','.')]
    

    有关将文件添加到可执行文件中的详细信息,请参阅 pyinstaller 使用规范文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 2013-02-21
      • 1970-01-01
      • 2020-09-05
      相关资源
      最近更新 更多