运行 来自 Python 的安全导入命令与命令行有不同的行为

Running security import command from Python has different behaviour than command line

我正在尝试使用以下命令将 pkcs#12 证书导入 OS X Keychain:

security import filename -k ~/Library/Keychains/login.keychain -P password -f pkcs12

在python中我这样使用subprocess

  if os.path.isfile(_file) and platform.system() == 'Darwin':
    keychain = os.path.expanduser('~/Library/Keychains/login.keychain')
    command_line = 'security import {} -k {} -P {} -f pkcs12'.format(_file, keychain, password)
    logger.info('Importing {} into OS X KeyChain.'.format(_file))
    return subprocess.call(shlex.split(command_line))

但是我收到此错误消息:

security: SecKeychainItemImport: One or more parameters passed to a function were not valid.

我什至尝试使用 shell=True,但后来我得到了 security 用法,就好像我传递了一些错误的参数一样。

Usage: security [-h] [-i] [-l] [-p prompt] [-q] [-v] [command] [opt ...]
...
...

但是,当从命令行 运行 时,该命令按预期工作:

security import <filename> -k <home>/Library/Keychains/login.keychain -P DTWLDHPYNBWBJB3 -f pkcs12
1 identity imported.
1 certificate imported.

有什么想法吗?从非交互式控制台 运行 security 时是否有限制?

任何 python 库来实现相同的?

此致

这实际上是由于另一个问题。

我使用的是未刷新或关闭的 tmp 文件。

虽然脚本是 运行,但该函数无法在该文件中找到任何内容。

脚本结束后,文件(有 'delete=False')被刷新,因此命令行工作没有问题。

解决方案是设置 bufsize=0 :(