我在Python3 subprocess模块中遇到错误。子进程围绕着一些重要的位置参数,我用Unicode引号将其引起来,这会导致linux命令find失败。
还有其他人有这个问题吗?我基本上是想弄清楚这是否是我的配置错误,还是应该将其发布为子流程团队的问题。我敢肯定我可以在代码中解决它,但这似乎只是应该解决的错误。
test.pyimport 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上运行,因此我希望这可能是仍在测试中使用软件的典型难题。
而不是使用glob(shell用于扩展before find
运行),请使用以下命令:
p = subprocess.run(['find', '/.snapshots/', '-path', '*/snapshot', '-maxdepth', '2', '-type', 'd' ], capture_output=True, encoding='utf-8')
-path
的参数是一种模式,旨在使find
本身可以与/.snapshots
下找到的任何文件进行匹配。