1

我正在尝试plistlib使用 macOS Python 2.7 中可用的库生成 .plist 文件。

以下代码有效:

#!/usr/bin/env python

from plistlib import writePlist

patches = [
    {
        'Arch': 'x86_64',
        'Base': 'early'
    },
    {
        'Arch': 'x86_64',
        'Base': 'late'
    }
]

result = [
    {
        'Arch': 'x86_64',
        'BundlePath': 'Alpha.kext'
    },
    {
        'Arch': 'x86_64',
        'BundlePath': 'Beta.kext'
    }
]
for i in patches:
    result.append(dict(i))

settings = {
    'Kernel': {
        'Add': result
    }
}
writePlist(settings, 'config.plist')

并生成一个config.plist包含以下内容的文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Kernel</key>
    <dict>
        <key>Add</key>
        <array>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>BundlePath</key>
                <string>Alpha.kext</string>
            </dict>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>BundlePath</key>
                <string>Beta.kext</string>
            </dict>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>Base</key>
                <string>early</string>
            </dict>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>Base</key>
                <string>late</string>
            </dict>
        </array>
    </dict>
</dict>
</plist>

但是,我config.plist需要将patches字典放在另一个字典中:

            <dict>
                <dict>
                    <key>Arch</key>
                    <string>x86_64</string>
                    <key>Base</key>
                    <string>early</string>

正确的配置文件必须如下所示(参见编辑器中的第 21 和 22 行):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Kernel</key>
    <dict>
        <key>Add</key>
        <array>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>BundlePath</key>
                <string>Alpha.kext</string>
            </dict>
            <dict>
                <key>Arch</key>
                <string>x86_64</string>
                <key>BundlePath</key>
                <string>Beta.kext</string>
            </dict>
            <dict>
                <dict>
                    <key>Arch</key>
                    <string>x86_64</string>
                    <key>Base</key>
                    <string>early</string>
                </dict>
                <dict>
                    <key>Arch</key>
                    <string>x86_64</string>
                    <key>Base</key>
                    <string>late</string>
                </dict>
            </dict>
        </array>
    </dict>
</dict>
</plist>

如何编辑我的setup.py文件以产生正确的dictionary inside dictionary输出?如果您徘徊我为什么要拆分代码,是因为这是一种非常简化的格式,实际代码要复杂得多。因此,我需要在上述代码设计中的解决方案。谢谢您的帮助。

4

1 回答 1

3

所需的输出看起来不正确。您的“字典词典”没有密钥。我怀疑它应该是这样的

<dict>
    <key>Patches</key>
    <array>
        <dict>
            <key>Arch</key>
            ...
        </dict>
        <dict>
            <key>Arch</key>
            ...
        </dict>
    </array>
</dict>

如果是这样,您可以使用“补丁”键来执行此操作。

patches = [
    {
        'Arch': 'x86_64',
        'Base': 'early'
    },
    {
        'Arch': 'x86_64',
        'Base': 'late'
    }
]

result = [
    {
        'Arch': 'x86_64',
        'BundlePath': 'Alpha.kext'
    },
    {
        'Arch': 'x86_64',
        'BundlePath': 'Beta.kext'
    }
]
result.append({"Patches": patches})

settings = {
    'Kernel': {
        'Add': result
    }
}
writePlist(settings, 'config.plist')

输出

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Kernel</key>
        <dict>
                <key>Add</key>
                <array>
                        <dict>
                                <key>Arch</key>
                                <string>x86_64</string>
                                <key>BundlePath</key>
                                <string>Alpha.kext</string>
                        </dict>
                        <dict>
                                <key>Arch</key>
                                <string>x86_64</string>
                                <key>BundlePath</key>
                                <string>Beta.kext</string>
                        </dict>
                        <dict>
                                <key>Patches</key>
                                <array>
                                        <dict>
                                                <key>Arch</key>
                                                <string>x86_64</string>
                                                <key>Base</key>
                                                <string>early</string>
                                        </dict>
                                        <dict>
                                                <key>Arch</key>
                                                <string>x86_64</string>
                                                <key>Base</key>
                                                <string>late</string>
                                        </dict>
                                </array>
                        </dict>
                </array>
        </dict>
</dict>
</plist>
于 2021-09-30T03:43:46.157 回答