我正在尝试使用 Python 中的 Linux 命令编写脚本以将以下输出获取到文件夹(YYYYMMDDHHMMSS = 当前日期和时间),ID 在配置文件中
1234_YYYYMMDDHHMMSS.txt
12345_YYYYMMDDHHMMSS.txt
12346_YYYYMMDDHHMMSS.txt
我有一个包含 ID 列表的配置文件
id1 = 1234
id2 = 12345
id3 = 123456
我希望能够在 python 中循环遍历这些并将它们合并到 linux 命令中。
目前,我的 linux 命令是在 python 中硬编码的
import subprocess
import datetime
now = datetime.datetime.now()
subprocess.call('autorep -J 1234* -q > /home/test/output/1234.txt', shell=True)
subprocess.call('autorep -J 12345* -q > /home/test/output/12345.txt', shell=True)
subprocess.call('autorep -J 123456* -q > /home/test/output/123456.txt', shell=True)
print now.strftime("%Y%m%d%H%M%S")
日期时间已定义,但当前不执行任何操作,只是在我想将其合并到输出 txt 文件时将其打印到控制台。但是,我希望能够编写一个循环来做这样的事情
subprocess.call('autorep -J id1* -q > /home/test/output/123456._now.strftime("%Y%m%d%H%M%S").txt', shell=True)
subprocess.call('autorep -J id2* -q > /home/test/output/123456._now.strftime("%Y%m%d%H%M%S").txt', shell=True)
subprocess.call('autorep -J id3* -q > /home/test/output/123456._now.strftime("%Y%m%d%H%M%S").txt', shell=True)
我知道我需要使用 ConfigParser 并且目前已经编写了这篇文章,它只是将 ID 从配置文件打印到控制台。
from ConfigParser import SafeConfigParser
import os
parser = SafeConfigParser()
parser.read("/home/test/input/ReportConfig.txt")
def getSystemID():
for section_name in parser.sections():
print
for key, value in parser.items(section_name):
print '%s = %s' % (key,value)
print
getSystemID()
但正如帖子开头所述,我的目标是能够遍历 ID,并将它们合并到我的 linux 命令中,同时将日期时间格式添加到文件末尾。我想我所需要的只是上述函数中的某种 while 循环,以获得我想要的输出类型。但是,我不确定如何将 ID 和日期时间调用到 linux 命令中。
请您参考如下方法:
到目前为止,您已经拥有了大部分所需的东西,只是缺少一些东西。
首先,我认为使用 ConfigParser 对此有点矫枉过正。但它很简单,所以让我们继续吧。让我们将 getSystemID
更改为返回您的 ID 的生成器,而不是将它们打印出来,这只是一行更改。
parser = SafeConfigParser()
parser.read('mycfg.txt')
def getSystemID():
for section_name in parser.sections():
for key, value in parser.items(section_name):
yield key, value
有了生成器,我们可以直接在循环中使用 getSystemID
,现在我们需要将其传递给子进程调用。
# This is the string of the current time, what we add to the filename
now = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
# Notice we can iterate over ids / idnumbers directly
for name, number in getSystemID():
print name, number
现在我们需要构建子流程调用。上面的大部分问题是知道如何格式化字符串,语法描述为 here .
我还将就您如何使用 subprocess.call
做两点说明。首先,传递参数列表而不是长字符串。这有助于 python 知道要引用哪些参数,因此您不必担心。您可以在 subprocess 中阅读相关信息和 shlex文档。
其次,您在命令中使用 >
重定向输出并且(正如您注意到的那样)需要 shell=True
才能工作。 Python 可以为您重定向,您应该使用它。
从我在 foor 循环中离开的地方继续。
for name, number in getSystemID():
# Make the filename to write to
outfile = '/home/test/output/{0}_{1}.txt'.format(number, now)
# open the file for writing
with open(outfile, 'w') as f:
# notice the arguments are in a list
# stdout=f redirects output to the file f named outfile
subprocess.call(['autorep', '-J', name + '*', '-q'], stdout=f)