python不打印“字符”

2024-09-27 09:31:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个奇怪的问题。我需要从stat命令打印出一个输出字符串

我已经编写了获取一些信息的代码

import glob
import os

for file in glob.glob('system1/**', recursive=True):
    os.system("stat -c \"set_metadata(/%n \"uid\", %u, \"gid\", %g, \"mode\", 0%a, \"capabilities\", 0x0, \"selabel\", \"later\");\" "f"{file}")

预期产出:

set_metadata("/system1/xbin/jack_transport" "uid", 0, "gid", 2000, "mode", 0755, "capabilities", 0x0, "selabel", "later");

但我的输出如下所示:

set_metadata(/system1/xbin/jack_transport uid, 0, gid, 2000, mode, 0755, capabilities, 0x0, selabel, later);

它没有在那里打印一个"。为什么会这样?我试着用“替换”来代替,但这不是我所需要的


Tags: importuidosmodeglobstatfilemetadata
1条回答
网友
1楼 · 发布于 2024-09-27 09:31:03

os.system()调用shell,它在Python已经完成的基础上进行自己的报价处理。您可以从Python和shell中反斜杠转义引号,但它很快就会变得复杂,因为您也必须从Python中反斜杠转义用于shell的反斜杠转义

适当的引用看起来像

for file in glob.glob('system1/**', recursive=True):
    os.system(f"""stat -c 'set_metadata(/%n "uid", %u, "gid", %g, "mode", 0%a, "capabilities", 0x0, "selabel", "later");' {file}""")

在这里,我们使用Python的三重引号将文本单引号和双引号传递给shell

当然,更好的解决方案是使用subprocess,它允许您完全绕过shell

for file in glob.glob('system1/**', recursive=True):
    subprocess.run(['stat', '-c',
      'set_metadata(/%n "uid", %u, "gid", %g, "mode", 0%a, "capabilities", 0x0, "selabel", "later");',
      file], check=True)

但是,如果所有实际的业务逻辑都在shell脚本中,那么为什么要使用Python呢

#!/bin/bash
stat -c 'set_metadata(/%n "uid", %u, "gid", %g, "mode", 0%a, "capabilities", 0x0, "selabel", "later");\n' system1/**

(如果glob返回大量匹配项,则可能需要使用xargs将其分解。)

相关问题 更多 >

    热门问题