子流程在 Python 3.7+ 中包含有问题的引号

Subprocess includes problematic quotation marks in Python 3.7+

问题

我在使用 Python3 subprocess 模块时遇到错误。子进程围绕着一些重要的位置参数,我给它加上了 unicode 引号,这导致 linux 命令 find 失败。

还有其他人遇到过这个问题吗?我基本上是想弄清楚它是否是我的配置错误,或者我是否应该 post 它作为子流程团队的问题。我确信我可以在我的代码中解决它,但它看起来像是一个应该被压扁的错误。

test.py
import subprocess
p = subprocess.run(['find', '/.snapshots/*/snapshot', '-maxdepth', '0', '-type', 'd' ], capture_output=True, encoding='utf-8')
print(p)
test.py 结果
CompletedProcess(
  args=['find', '/.snapshots/*/snapshot', '-maxdepth', '0', '-type', 'd'], 
  returncode=1,
  stdout='',
  stderr='find: ‘/.snapshots/*/snapshot’: No such file or directory\n'
)

我的看法

在我看来,子进程强制 find 用 unicode 引号将我的路径字符串括起来,而 bash 只是将这些引号注册为另一个字符,就像 find 命令总是做的那样。

预期命令
user@mine:$ find /.snapshots/*/snapshot/ -maxdepth 0 -type d
/.snapshots/1/snapshot/
/.snapshots/2/snapshot/
/.snapshots/3/snapshot/
命令好像是运行
user@mine:$ find ‘/.snapshots/*/snapshot’ -maxdepth 0 -type d
find: ‘‘/.snapshots/*/snapshot\’’: No such file or directory

引号是 unicode 的事实不是问题。使用 find 命令(至少根据我使用过的版本的经验),您只是不想传递被任何类型的引号括起来的路径。即使有一种变通方法可以使此行为适用于 find 命令,等待下一个不需要引号的 bash 程序似乎仍然是个问题。

另一个失败的查找命令
user@mine:$ find '/.snapshots/*/snapshot' -maxdepth 0 -type d
find: '/.snapshots/*/snapshot': No such file or directory

系统详细信息

当我第一次运行遇到这个问题时,我是运行 Python 3.7.4。我更新了看看是否有修复,所以我现在是 运行 python 3.8.1。我 运行 在 Arch Linux 上,所以我预计这可能是使用仍在测试中的软件的典型痛苦。

不要使用 glob(shell 旨在在 find 运行之前扩展 ,而是使用以下内容:

p = subprocess.run(['find', '/.snapshots/', '-path', '*/snapshot', '-maxdepth', '2', '-type', 'd' ], capture_output=True, encoding='utf-8')

-path 的参数是一种模式,旨在让 find 本身对 /.snapshots 下找到的任何文件使用匹配。