为什么python程序无法获取最新文件?

时间:2019-05-14 08:34:57

标签: automation python-3.6

我正在从事自动化POC,其中我必须按顺序执行以下步骤: 1)借助工具创建一个debian pkg,并将其推送到云存储库

2)在生产服务器上,我将通过cron作业执行python程序,该程序将继续监视云位置,如果有可用的新文件,它将从那里拉出该文件并进行安装(debian)在运行python程序的服务器上运行。但是,有可能云存储库可能几天都无法获取新文件。因此,在这种情况下,即使回购文件在3天前进行了更新,但对于正在监视云位置的python程序,在云上上传的文件将是最新的文件,直到有新文件出现为止。因此,作为一种变通方法,我正在尝试处理将继续比较时间戳的逻辑,即,如果debian文件的时间戳不变,则python程序应该退出/传递,否则执行业务逻辑。

我编写了两个程序,它们满足点(1),部分满足点(2)。因此,我将在这里重点介绍point(2)代码。下面是我认为应该在后台工作以提取最新文件的代码,如果时间戳相同,则应退出以测试场景,我已经采用了机器的本地路径:

import os
import subprocess
import glob
latest_file = 0 # initialized latest_file with zero to compare later
new_path = '/home/amitesh/Desktop'
file_path = glob.iglob('/home/amitesh/Desktop/linux_triad/*.deb')

latest_file = max(file_path, key=os.path.getctime) # Now the latest_file variable has a file in it
time_stamp = os.path.getmtime(latest_file)# gives the timestamp of the latest file

a = 0 # initialized it with zero to compare it with time stamp as follows.
while True:
    if a == time_stamp:
        pass
    else:
        subprocess.Popen(['cp', '-r', latest_file, new_path])
        break

在上面的代码中,我只是试图比较两个变量'a'和'timestamp',即,如果a的值与time_stamp相同,则不执行任何操作,然后简单地通过。否则执行业务逻辑。 在执行代码时,我确实看到文件已复制到所需位置,但是,如果我检查文件时间戳,那似乎不是最新的。下面是file_path变量中可用的文件。

baqus_0.1-2_amd64.deb Tue 14 May 2019 01:24:02 PM IST
baqus_0.3-1_amd64.deb Tue 14 May 2019 01:24:04 PM IST
baqus_0.4-1_amd64.deb Tue 14 May 2019 01:24:09 PM IST
leesofd_0.1-1_amd64.deb Tue 14 May 2019 01:24:16 PM IST
syslmd_0.3-2_amd64.deb Tue 14 May 2019 01:24:21 PM IST

我的代码从列表中选取了第二个文件,如果我们仔细观察的话,它似乎没有最新的时间戳。最新时间戳属于syslmd_0.3-2_amd64.deb,它是IST下午01:24:21。因此,再次,我的代码选择的是baISTs_0.3-1_amd64.deb,其时间戳为IST的01:24:04 PM IST。 我已经多次执行它,只是为了确保我的观察正确无误。每次将相同文件复制到目标位置。

所以,或者我的逻辑是错误的,或者我使用的是错误的函数。请提出。

while循环内更​​改的代码

if a == time_stamp:
    pass
else:
    print('copying of the ', latest_file, 'started')
    sleep(4)
    subprocess.Popen(['cp', '-r', latest_file, new_path])
    sleep(3)
    os.system('sudo dpkg --install ' +latest_file)
    a = time_stamp

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解需要这种解决方法的原因-但有一件事引起了我的注意:

您正在使用key=os.path.getctime对文件进行排序。跟随docs 就是

  

“在某些系统(例如Unix)上,是上次元数据更改的时间,而在其他系统(例如Windows)上,是路径的创建时间。”

作为排序结果的时间戳记,您存储os.path.getmtime(latest_file), 根据{{​​3}}

  

“返回上次修改路径的时间。”

根据此docs,这两个时间戳不一定相同。因此ctime也可能取决于时间,文件被复制以及取决于您在步骤1)中推送文件的方式。相反,mtime与文件内容有关。

因此,请在两个语句中均使用getmtime。如果那不起作用,作为最后的选择, 您还可以将文件命名为20190516_095200_sth.deb,然后按文件名排序。