0

我第一次发帖-请对我放轻松。我想不出一个简洁的标题来概括这个问题。我似乎有一个编解码器问题。

我的基于 django 的网站调用一个子进程 (soffice) 将上传的文档转换为基本的文本文件,然后继续对文档中的文本进行一些处理。这在一段时间内工作得很好。在我的本地开发机器上,文件转换的单元测试仍然可以完美运行,就像完整的 django 应用程序一样,端到端。在生产服务器上,这一切都过去了,文件转换调用在 django 应用程序中不再工作,而从测试代码运行时它可以正常工作。这种行为变化似乎是运行常规服务器更新的结果。

args = ['soffice',
        '--headless',
        '--convert-to',
        'txt:Text',
        '--outdir',
        outDir,
        filePath]

subprocess.call(args)

fo = open(textFilePath, "r")

try:
    docText = fo.read()
except:
    print("Failed to read", textFilePath)
    docText = None

我删除了一些错误检查以简化一点。

当我在生产服务器上将文件转换代码作为完整 django 应用程序的一部分运行时,我可以看到某些特殊字符(例如符号 §)变成了垃圾。但是,如果我在 django 之外的同一台机器上自己运行相同的文件转换代码,则这些符号不会损坏。如前所述,在我的开发机器上,它既可以独立运行,也可以在 django 中运行。两台机器之间的一个区别是我如何运行 django。在本地,它使用 django 的 runserver 命令运行。在生产机器上,它使用带有 apache 的 mod_wsgi。我看不出 django 或 mod_wsgi 怎么可能干扰 soffice 在子进程中所做的事情,但确实是这样。我在问题服务器上打开了一个 python shell 并运行与上面基本相同的代码,得到干净的文本,

真诚感谢任何帮助!

4

2 回答 2

0

如果您使用 mod_wsgi 守护程序模式,请确保您正在设置 lang/locale,否则您将从操作系统继承默认的 ASCII 编码。

这也会传播到子进程。

如果不使用守护程序模式,您真的应该考虑这样做,因为它优于 mod_wsgi 的嵌入式模式。如果使用嵌入式模式,则更改语言/语言环境会有些困难,因为必须在 Apache 启动脚本中完成,并且如何做到这一点取决于平台和发行版。

于 2017-10-05T04:02:01.790 回答
0

解决方案是使用以下命令升级 mod_wsgi:

pip install mod_wsgi --upgrade
于 2017-10-10T01:00:50.633 回答