Python 捕获标准输出,然后在文件名上进行协调

Python 捕获标准输出,然后在文件名上进行协调,python,subprocess,python-2.6,Python,Subprocess,Python 2.6,我一直在努力解决这个问题,我试图创建一个程序,根据当前日期和时间创建一个datetime对象,从我们的文件数据中创建第二个这样的对象,找出两者之间的差异,如果超过10分钟,则搜索“握手文件”,这是我们成功加载文件后收到的文件。如果我们找不到那个文件,我想发出一封错误电子邮件 我的问题在于能够以一种有意义的方式捕获我的ls命令的结果,这样我就能够解析它,并查看是否存在正确的文件。这是我的密码: """ This module will check the handshake files sent

我一直在努力解决这个问题,我试图创建一个程序,根据当前日期和时间创建一个
datetime
对象,从我们的文件数据中创建第二个这样的对象,找出两者之间的差异,如果超过10分钟,则搜索“握手文件”,这是我们成功加载文件后收到的文件。如果我们找不到那个文件,我想发出一封错误电子邮件

我的问题在于能够以一种有意义的方式捕获我的
ls
命令的结果,这样我就能够解析它,并查看是否存在正确的文件。这是我的密码:

"""
This module will check the handshake files sent by Pivot based on the following conventions:
- First handshake file (loaded to the CFL, *auditv2*): Check every half-hour
- Second handshake file (proofs are loaded and available, *handshake*): Check every 2 hours
"""
import smtplib
from email.mime.text import MIMEText
from datetime import datetime, timedelta
from csv import DictReader
from subprocess import *
from os import chdir
from glob import glob


def main():
    audit_in = '/prod/bcs/lgnp/clientapp/csvbill/audit_process/lgnp.smr.csv0000.audit.qty'
    with open(audit_in, 'rbU') as audit_qty:    
        my_audit_reader = DictReader(audit_qty, delimiter=';', restkey='ignored')
        my_audit_reader.fieldnames = ("Property Code",
                                      "Pivot ID", 
                                      "Inwork File", 
                                      "Billing Manager E-mail", 
                                      "Total Records", 
                                      "Number of E-Bills", 
                                      "Printed Records", 
                                      "File Date", 
                                      "Hour", 
                                      "Minute", 
                                      "Status")

        # Get current time to reconcile against
        now = datetime.now()

        # Change internal directory to location of handshakes
        chdir('/prod/bcs/lgnp/input')   

        for line in my_audit_reader:
            piv_id = line['Pivot ID']
            status = line['Status']
            file_date = datetime(int(line['File Date'][:4]),
                                 int(line['File Date'][4:6]),
                                 int(line['File Date'][6:8]),
                                 int(line['Hour']),
                                 int(line['Minute']))
            # print(file_date)
            if status == 's':
                diff = now - file_date
                print diff
                print piv_id
                if 10 < (diff.seconds / 60) < 30:
                    proc = Popen('ls -lh *{0}*'.format(status),
                                 shell=True) # figure out how to get output

                    print proc




def send_email(recipient_list):
    msg = MIMEText('Insert message here')
    msg['Subject'] = 'Alert!! Handshake files missing!'
    msg['From'] = r'xxx@xxx.com'
    msg['To'] = recipient_list

    s = smtplib.SMTP(r'xxx.xxx.xxx')
    s.sendmail(msg['From'], msg['To'], msg.as_string())
    s.quit()


if __name__ == '__main__':
    main()
“”“
此模块将根据以下约定检查Pivot发送的握手文件:
-第一次握手文件(加载到CFL,*auditv2*):每半小时检查一次
-第二次握手文件(证据已加载且可用,*握手*):每2小时检查一次
"""
导入smtplib
从email.mime.text导入MIMEText
从datetime导入datetime,timedelta
从csv导入DictReader
从子流程导入*
从操作系统导入chdir
从全局导入全局
def main():
audit_in='/prod/bcs/lgnp/clientapp/csvbill/audit_process/lgnp.smr.csv0000.audit.qty'
打开(审计单元在“rbU”中)作为审计单元数量:
my_audit_reader=DictReader(audit_数量,分隔符=“;”,restkey='ignored')
my_audit_reader.fieldnames=(“属性代码”,
“透视ID”,
“工作文件”,
“计费管理器电子邮件”,
“总记录”,
“电子账单数量”,
“印刷记录”,
“存档日期”,
“小时”,
“分钟”,
“地位”)
#获取要与之对账的当前时间
now=datetime.now()
#将内部目录更改为握手位置
chdir('/prod/bcs/lgnp/input')
对于my_audit_reader中的行:
piv_id=线['Pivot id']
状态=行['status']
file_date=datetime(int(第['file date'][:4]行),
int(第['文件日期][4:6]行),
int(第['文件日期][6:8]行),
int(行['Hour']),
int(第['Minute']行)
#打印(文件日期)
如果状态=='s':
diff=现在-文件\u日期
打印差异
打印个人识别码
如果10<(差秒/60)<30:
proc=Popen('ls-lh*{0}*')。格式(状态),
shell=True)#找出如何获得输出
打印过程
def发送电子邮件(收件人列表):
msg=MIMEText('在此处插入消息')
msg['Subject']='Alert!!缺少握手文件!'
msg['From']=r'xxx@xxx.com'
msg['To']=收件人列表
s=smtplib.SMTP(r'xxx.xxx.xxx')
s、 sendmail(msg['From'],msg['To'],msg.as_string())
s、 退出
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

解析ls输出并不是这里的最佳解决方案。您当然可以使用解析结果或任何其他方式,但让我给您一个建议

<> P>这是一个很好的判断错误的标准,如果你发现自己解析某人的输出或日志来解决标准问题,请考虑其他解决方案,如下面提供的:

如果您只想查看目录的内容,请使用以下命令:

现在,您的my_home_files变量中有一个文件列表。 您可以按照您想要的方式过滤它们,或使用元字符,如下所示:

glob.glob("/home/me/handshake-*.txt") # will output everything matching the expression 
# (say you have ids in your filenames).
之后,您可能需要检查文件的一些统计信息(如上次访问日期等) 考虑使用:


不要解析
ls
。曾经只需使用
os.path
和朋友。支持凯文所说的。正确的方法是使用
os.listdir
和(可能的)
os.isfile
。谢谢各位,所以子流程似乎相当无关,除非您需要使用
Popen
功能。。。
glob.glob("/home/me/handshake-*.txt") # will output everything matching the expression 
# (say you have ids in your filenames).
os.stat(my_home_files[0]) # outputs stats of the first
# posix.stat_result(st_mode=33104, st_ino=140378115, st_dev=3306L, st_nlink=1, st_uid=23449, st_gid=59216, st_size=1442, st_atime=1421834474, st_mtime=1441831745, st_ctime=1441234474)
# see os.stat linked above to understand how to parse it