Skip to main content
 首页 » 编程设计

python之使用 Python 中的日期时间将配置文件 ID 调用到 Linux 命令中

2023年11月22日81落叶无声

我正在尝试使用 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)