json.load / simplejson.load在打包的Python应用程序中失败(PyInstaller或cx_freeze)

时间:2014-06-10 02:00:04

标签: python json windows pyinstaller cx-freeze

我有一个命令行Python应用程序,它加载在命令行上指定的JSON文件:

with open(sys.argv[1]) as f:
    data = json.load(f)

使用系统Python解释器按原样运行应用程序时,这一切都很好,但是一旦它通过PyInstaller或cx_freeze打包到EXE中,我会收到以下错误:

Traceback (most recent call last):
  File "<string>", line 92, in <module>
  File "c:\Users\user\Documents\build\main\out00-PYZ.pyz\simplejson"
, line 444, in load
  File "c:\Users\user\Documents\build\main\out00-PYZ.pyz\simplejson"
, line 501, in loads
  File "c:\Users\user\Documents\build\main\out00-PYZ.pyz\simplejson.
decoder", line 370, in decode
  File "c:\Users\user\Documents\build\main\out00-PYZ.pyz\simplejson.
decoder", line 389, in raw_decode
simplejson.scanner.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

当使用内置的json模块时,我收到另一个错误:

ValueError: No JSON object could be decoded

有问题的JSON文件是有效的,可以在没有REPL的问题的情况下加载。

有没有人对问题可能有什么想法?

UPDATE 1:奇怪的是,当我用硬编码文件名替换sys.argv [1]时,事情就会起作用。我已经确认sys.argv [1]正确映射到冻结应用程序中的文件名。

更新2:我已经确认在json.load调用成功之后抛出了异常 - 在可以到达之后插入了一个print语句。

更新3:误报!这个应用程序使用Flask,事实证明我启用了调试模式,这导致自动重载器尝试使用不正确的参数再次运行main()块。

1 个答案:

答案 0 :(得分:1)

误报!这个应用程序使用Flask,事实证明我启用了调试模式,这导致自动重载器尝试使用不正确的参数再次运行main()块。

如果你正在使用任何类型的打包器和FLask应用程序,请确保禁用调试模式。