首页 > 解决方案 > 如何在 Python 中使用子进程在文件名中添加变量

问题描述

我是 python 新手,想用变量名作为文件名创建一个文件-

例如两个变量是 - msid, serviceid 文件名应该是 serviceid.msid.req 在某个路径中,其中包含当前日期。

我写了这段代码 -

result = subprocess.run(
    [
        "cat `date` > ",
        /Users/ngupta59/code/python-prm-example-agent/str(self.spec.serviceid).str(self.spec.msid).req,
    ],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
)

这是正确的方法吗?如果可以的话请帮忙

标签: pythonpython-3.xsubprocess

解决方案


是的,你这样做的方式是一个好方法(编程中没有“正确的方法”,因为你总是可以用至少两种方式做一件事,这两种方式各有利弊!)。但是您首先应该将路径放在引号中,以便它是一个字符串(现在它是一个不存在的无效变量名,它将引发 a SyntaxError)。然后,您有多种可能将变量放入路径中:

  1. 使用字符串插值
"/Users/ngupta59/code/python-prm-example-agent/%s.%s.req" % (str(self.spec.serviceid), str(self.spec.msid))
  1. 使用f 字符串(仅在 Python >= 3.6 中可用):
f"/Users/ngupta59/code/python-prm-example-agent/{str(self.spec.serviceid)}.{str(self.spec.msid)}.req"
  1. 将路径组件连接在一起,我不喜欢这种方式,因为您必须输入很多 + 符号和引号:
"/Users/ngupta59/code/python-prm-example-agent/" + str(self.spec.serviceid) + "." + str(self.spec.msid) + ".req"
  1. 使用str.format,但我从未使用过它,因为我认为百分号替换和 f 字符串更好。

如果您想要可在 Python 3 和 Python 2 上运行的代码,请使用字符串插值。如果您想要明显且易于理解的代码,请使用 f-strings。

附注:每个参数 forsubprocess.run都应该放在一个单独的字符串中。以下是使用 f-strings 的完整代码:

result = subprocess.run(
    [
        "cat",
        "`date`"
        ">",
        f"/Users/ngupta59/code/python-prm-example-agent/{str(self.spec.serviceid)}.{str(self.spec.msid)}.req",
    ],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
)

推荐阅读