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

问题描述 投票:0回答:1

问题

我在Python3 subprocess模块中遇到错误。子进程围绕着一些重要的位置参数,我用Unicode引号将其引起来,这会导致linux命令find失败。

还有其他人有这个问题吗?我基本上是想弄清楚这是否是我的配置错误,还是应该将其发布为子流程团队的问题。我敢肯定我可以在代码中解决它,但这似乎只是应该解决的错误。

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的事实是not问题。使用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上运行,因此我希望这可能是仍在测试中使用软件的典型难题。

python bash subprocess python-3.7 python-3.8
1个回答
0
投票

而不是使用glob(shell用于扩展before find运行),请使用以下命令:

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

-path的参数是一种模式,旨在使find本身可以与/.snapshots下找到的任何文件进行匹配。

© www.soinside.com 2019 - 2024. All rights reserved.