在python中,如何读取存储在数据库中的文件而不是文件系统,并将其用作Popen上的参数

在python中,如何读取存储在数据库中的文件而不是文件系统,并将其用作Popen上的参数,python,Python,我正在使用子进程Popen从python运行一个命令。命令有一个参数,用于指示它将使用的文件的路径。只能通过该参数指定该文件 该命令类似于: command -file /path/to/file cat /path/to/file | command -file 我不能这样做: command -file /path/to/file cat /path/to/file | command -file 问题是我在数据库中有这个文件,我从python应用程序中读取它。我希望避免将文件临时保

我正在使用子进程Popen从python运行一个命令。命令有一个参数,用于指示它将使用的文件的路径。只能通过该参数指定该文件

该命令类似于:

command -file /path/to/file
cat /path/to/file | command -file
我不能这样做:

command -file /path/to/file
cat /path/to/file | command -file
问题是我在数据库中有这个文件,我从python应用程序中读取它。我希望避免将文件临时保存到磁盘并在命令中指定它

有没有办法将内存中的文件作为该参数的参数通过管道传输到Popen

谢谢

编辑: 好的,我应该指定命令和代码,但我当时没有。 我正在尝试使用openssl执行ocsp证书请求。我知道python有一个openssl模块,但我想避免额外的python模块

这是python代码:

openssl = '/path/to/openssl'
ossl = subprocess.Popen([openssl, 'ocsp', '-no_cert_verify', '-issuer', 'cacert.cer', '-serial', '0x1234', '-url', url], stdout=PIPE, stderr=PIPE)

我已将cacert.cer存储在数据库中。无论如何,我还没有看到将管道参数传递给-issuer,我希望有任何方法可以使用subprocess.pipe以某种方式将其管道化。如果是unix,则可以使用命名管道。它的工作原理类似于管道,但使用文件系统上的路径

  • 使用
    os.mkfifo()创建fifo
  • 启动Popen并将fifo路径作为参数传递
  • 将数据库中的内容写入fifo

  • 不要忘记对打开的fifo文件执行
    .close()
    ,否则从
    Popen()
    开始的进程将永远不知道文件的结尾在哪里。

    如果命令,如您所说,需要文件系统中的文件路径,以便对某些数据进行操作,那么,只有一种方法可以为它提供这样的数据:在文件系统中拥有一个文件。如果该文件还不存在,因为数据在数据库中而不是在单个文件中,那么从逻辑上讲,您必须在调用该命令之前创建该文件。但是,请注意,有一些技巧,特别是在兼容POSIX的系统上,可以高效地创建这样的文件。skyjur提到了其中一个技巧。

    我不太清楚。您想在数据库中读取一个文件,并在python代码中使用这些参数吗?也许发布实际代码会有所帮助。您确定命令只按顺序读取文件一次吗?如果它对文件进行多次扫描或尝试查找,您可能需要创建一个临时文件。我编辑了这篇文章以使其更清晰。@Karl:我们有帮助吗?请注意,只有当程序只读取一次文件时,这种方法才会起作用。如果它执行两次文件传递,或者尝试在其中查找,这将不起作用!