gpt4 book ai didi

python - subprocess.run() 参数编码

转载 作者:行者123 更新时间:2023-11-28 19:05:06 24 4
gpt4 key购买 nike

我有一个 Flask 应用程序(Linux、带有 mod_wsgi 的 Apache、Python 3),它调用带有一些参数的 shell 脚本。当 subprocess.run() 命令参数中有任何非 ascii 字符时,应用程序会出现以下错误:

'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)

我花了很多时间试图修复它。

在命令行中不存在这样的问题,只有在应用程序中存在。

整个应用程序的输出都是 Unicode 格式,没有任何问题。经过一些研究,我得出的结论是“文件系统编码”有问题。

我在我的 run.wsgi 脚本中添加了一些日志记录语句。 FS 编码确实是“ascii”(在命令行中是“utf-8”)。

下一步我找到了这篇文章 How to change file system encoding via python?

Apache httpd 服务器在其环境中以 LANG=C 启动。尽管 /etc/sysconfig/httpd 中有警告,但我已将其更改为 C.UTF-8。这没有帮助,FS 编码仍然是“ascii”。然后,我什至将 sys.getfilesystemencoding() 猴子修补为 lambda: 'utf-8'。但是错误仍然存​​在。

每次更改后我都正确地重新启动了 httpd 服务。

我已经无计可施了。

  1. 我的问题真的是由 FS 编码引起的吗?
  2. 如果是,为什么我将其更改为 utf-8 的尝试失败了?
  3. 最重要的是:我该如何解决这个问题?

更新 1:

代码片段:

    import subprocess as sub
cmdresult = sub.run(
[SCRIPT, tid, days, name],
stdin=sub.DEVNULL, stdout=sub.PIPE, stderr=sub.DEVNULL,
encoding='ascii', # 'utf-8' will not help, this affects stdin, stdout I/O only
check=True)

最佳答案

(回答自己的问题,希望对其他人有帮助)

我做了一个简短的测试程序。这是我发现的:

  1. 文件系统编码是关键。
  2. 猴子补丁不起作用。嗯,没关系。无论如何,它作为解决方案是 Not Acceptable 。
  3. LANG=C.UTF-8 需要安装区域设置,但它不在我的系统上(使用 locale -a 检查)。但在第二个可用的系统上,它起作用了。
  4. 我可以显式进行编码并将字节作为参数之一传递:

    cmdresult = sub.run(
    [SCRIPT, tid, days, name.encode('utf-8')],
    ...

这行得通,但有一个问题需要解决:

它是否符合文档?

我能找到的是:

args should be a sequence of program arguments or else a single string

而且我确实把它理解为一个字符串或者一个字符串列表,但实际上它并没有指定一个列表是什么类型。我也通过了 int 看看会发生什么。我收到此错误:

预期的 str、bytes 或 os.PathLike 对象

所以我的解决方案似乎没问题。

关于python - subprocess.run() 参数编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47946134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com